Cod sursa(job #503895)

Utilizator APOCALYPTODragos APOCALYPTO Data 25 noiembrie 2010 16:25:16
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<string>
#define pb push_back
#define oo 0x3f3f3f3f
#define common int m=(l+r)>>1, L=n<<1, R=L|1 

#define nmax 50005
#define Nmax 150005

struct leg{
	int n,c;
};

vector<leg> G[nmax];
ofstream fout("dijkstra.out");
int N,M,nh;
int d[50005];
int H[Nmax];
int poz[Nmax];



void update(int n,int ql,int l,int r, int v )
{
	if(ql<=l && r<=ql)
	{
		H[n]=v;
		
		poz[n]=l;
		return;
	}		
	common;
	
	
	
	if(ql<=m)
		update(L,ql,l,m,v);
	if(ql>=m+1)
		update(R,ql,m+1,r,v);
	
	
	if(H[L]<H[R])
	H[n]=H[L], poz[n]=poz[L];
	
	else
	H[n]=H[R], poz[n]=poz[R];
	
	
}


void solve()
{int u,i;
vector<leg>::iterator it;
nh=N;
memset(d, oo, sizeof(d));
d[1]=0;

for(i=1;i<=N;i++) update(1,i,1,N,d[i]); 


while(nh)
{  
	nh--;
	u=poz[1];
	update(1,poz[1],1,N,oo);
	
	for(it=G[u].begin();it!=G[u].end();it++)
	{
		if(d[it->n]>d[u]+it->c)
		{
			d[it->n]=d[u]+it->c;
			update(1,it->n,1,N,d[it->n]);
		}
	}
	
	
}

for(i=2;i<=N;i++)
{
	if(d[i]==oo) d[i]=0;
	fout<<d[i]<<" ";
}


}

void cit()
{int i, x,y,c;
	
	ifstream fin("dijkstra.in");
	
	fin>>N>>M;
	for(i=2;i<=N;i++) 
		  d[i]=oo;
	d[1]=0;
	
	for(i=1;i<=M;i++)
	{	
		fin>>x>>y>>c;
		G[x].pb((leg){y,c});
    }
    
	fin.close();
}
int main()
{
	
	cit();
	solve();
	
	fout.close();
	return 0;
}