Cod sursa(job #642193)

Utilizator stephy_yoyoIonescu Stefania stephy_yoyo Data 30 noiembrie 2011 17:51:11
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
# include <cstdio>
# include <algorithm>
# include <set>
# define cost first
# define nod second

using namespace std;

set < pair<int,int> > s;
char fin[50001];
int drum[50001],ind[50001];

struct date
{
	int a,b,co;
};

date v[250001];

int cmp(date x, date y)
{
	return x.a<y.a;
}

int main ()
{
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	int n,m,aa,bb,c,l=0,curent=1,fi=1;
	scanf ("%d%d",&n,&m);
	for (int i=1; i<=m;i++)
	{
		scanf ("%d%d%d",&aa,&bb,&c);
		v[++l].a=aa;
		v[l].b=bb;
		v[l].co=c;
	}
	for (int i=1;i<=n;i++)
		drum[i]=2000000;
	for (int i = 1; i <= n; i++) {
		v[m + i].a = i;
		v[m + i].b = i;
		v[m + i].co = 0;
	}
	sort (v+1,v+m+n+1,cmp);
	for (;v[curent].a==1;curent++)
	{
		s.insert(make_pair(v[curent].co,v[curent].b));
		fin[v[curent].b]=1;
	}
	for (int i=2; i<=n;i++)
		s.insert(make_pair(2000000,i));
	s.insert(make_pair(0,1));
	v[n + m + 1].a = n + 1;
	for (int i=curent;i<=m+n + 1;i++)
		if (v[i].a!=v[i-1].a)
			ind[v[i].a]=i;
		
	/*for (int i = 1; i <= n; i++)
		printf("%d %d\n", ind[i], ind[i + 1]);
	printf("\n");*/
	for (;fi<=n;fi++)
	{
		int act=s.begin()->nod;
		drum[act]=s.begin()->cost;
		fin[act]=1;
		s.erase(make_pair(drum[act],act));
		for (int i=ind[act];i<ind[act+1];i++)
			if (drum[v[i].b]>(v[i].co+drum[v[i].a]))
			{
				s.erase(make_pair(drum[v[i].b],v[i].b));
				s.insert(make_pair(drum[v[i].a]+v[i].co,v[i].b));
				drum[v[i].b]=drum[v[i].a]+v[i].co;
				//printf("    %d %d %d\n", v[i].a, v[i].b, v[i].co);
			}
		//printf("%d %d\n", act, drum[act]);
	}
	for (int i=2; i<=n;i++)
		if (drum[i]==2000000)
			printf("0 ");
		else
			printf ("%d ",drum[i]);
	return 0;
}