Cod sursa(job #592778)

Utilizator Robert29FMI Tilica Robert Robert29 Data 30 mai 2011 18:42:40
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream fi("dijkstra.in");
ofstream fo("dijkstra.out");
int nr,n,m,a,b,c,sol[50001],d[100001],k,p[100001],t[100001];
char viz[100001];
vector <pair<int,int> > v[50001];

void down(int x){
	
	int k=d[x];
	int pk=p[x];
	int ok=1;
	while(ok&&x<=nr){
		int son=x;
		if(2*x<=nr)
			if(d[2*x]<k)
				son=2*x;
		if(2*x+1<=nr)
			if(d[2*x+1]<d[2*x]&&d[2*x+1]<k)
				son=2*x+1;
		if(son==x) 
			ok=0;
		else{
			d[x]=d[son];
			p[x]=p[son];
			t[p[x]]=x;
			x=son;
		}
	}
	d[x]=k;
	p[x]=pk;
	t[p[x]]=x;
}
void up(int x){
	int k=d[x];
	int pk=p[x];
	
	while(x>1&&d[x/2]>k){
		d[x]=d[x/2];
		p[x]=p[x/2];
		t[p[x]]=x;
		x/=2;
	}
	d[x]=k;
	p[x]=pk;
	t[p[x]]=x;
}
void dijkstra(int x){
	int min=2000000000;
	if(nr){
	min=d[1];
	k=p[1];
	sol[p[1]]=d[1];
	d[1]=d[nr];
	p[1]=p[nr];
	--nr;
	down(1);
	}
	if(min!=2000000000){	
		viz[k]=1;
		for(int i=0;i<v[k].size();++i)
			if(viz[v[k][i].first]==0)
				if(d[t[v[k][i].first]]>min+v[k][i].second){
					d[t[v[k][i].first]]=min+v[k][i].second;
					up(t[v[k][i].first]);
				}
		dijkstra(k);
	}
}
int main() {
	fi>>n>>m;
	for(int i=1;i<=m;++i){
		fi>>a>>b>>c;
		v[a].push_back(make_pair(b,c));
	}
	int l=2*n+1;
	for(int i=2;i<=l;++i)
		d[i]=2000000000;
	nr=n;
	for (int i=1;i<=n;++i){
		p[i]=i;
		t[i]=i;
	}
	dijkstra(1);
	for(int i=2;i<=n;++i)
		if(sol[i]!=2000000000)
			fo<<sol[i]<<' ';
		else
			fo<<0<<' ';
	fi.close();
	fo.close();
	return 0;
}