Cod sursa(job #592758)

Utilizator Robert29FMI Tilica Robert Robert29 Data 30 mai 2011 17:26:28
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 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];
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;
		int son1=0;
		if(d[2*x]<k)
			son=2*x;
		if(2*x+1<nr)
			if(d[2*x+1]<d[son])
				son=2*x+1;
		if(son ==x||son>=nr) 
			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){	
		for(int i=0;i<v[k].size();++i)
			if(d[t[v[k][i].first]]>min+v[k][i].second){
				d[t[v[k][i].first]]=min+v[k][i].second;
				up(p[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;
}