Cod sursa(job #718857)

Utilizator Robert29FMI Tilica Robert Robert29 Data 21 martie 2012 10:27:04
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<stdio.h>
#include<vector>
#define max 2000000000
using namespace std;
FILE*f=fopen("dijkstra.in","r");
FILE*g=fopen("dijkstra.out","w");
int a,b,c,nr,n,m,d[200001],p[200001],t[200001],sol[50001];
char viz[50001];
vector <pair<int,int> > v[250001];
void up(int x)
{
	int k=d[x];
	int pk=p[x];
	while(x>1&&k<d[x/2])
	{
		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 down(int x)
{
	int k=d[x];
	int pk=p[x];
	int ok=1;
	while(ok&&x<=nr)
	{
		int son=0;
		if(2*x<=nr)
			son=2*x;
		if(2*x+1<=nr&&d[2*x+1]<d[2*x])
			son=2*x+1;
		if(d[son]>=k||!son)
			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 dijkstra()
{
	int k;
	int min=max;
	if(nr)
	{
		min=d[1];
		sol[p[1]]=d[1];
		k=p[1];
		d[1]=d[nr];
		p[1]=p[nr];
		--nr;
		down(1);
	}
	
	if(min!=max)
	{
		viz[k]=1;
		for(int i=0;i<v[k].size();++i)
			if(!viz[v[k][i].first])
				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();		
	}
	
	
}
int main()
{
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		fscanf(f,"%d%d%d",&a,&b,&c);
		v[a].push_back (make_pair(b,c));
	}
	for(int i=2;i<=n;++i)
		d[i]=max;
	for(int i=1;i<=n;++i)
	{
		p[i]=t[i]=i;
	}
	nr=n;
	dijkstra();
	
	for(int i=2;i<=n;++i)
		if(sol[i]!=max)
			fprintf(g,"%d ",sol[i]);
		else
			fprintf(g,"0 ");
	
	fclose(g);
	fclose(f);
	return 0;
}