Cod sursa(job #442385)

Utilizator mottyMatei-Dan Epure motty Data 14 aprilie 2010 12:12:22
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<set>
#include<vector>
#define pb push_back
#define mp make_pair
#define to first
#define cc second
#define cost first
#define index second
#define beg (*p.begin())
using namespace std;

const int N=50001,INF=1000000001;

multiset < pair<int,int> > p;
vector < pair<int,int> > v[N];
int n,m,c[N],s[N];
bool st[N];

void read()
{
	int x,y,z;
	scanf("%d%d",&n,&m);
	while(m--)
	{
		scanf("%d%d%d",&x,&y,&z);
		s[x]++;
		s[y]++;
		v[x].pb( mp(y,z) );
		v[y].pb( mp(x,z) );
	}
}

void ini()
{
	for( int i=2 ; i<=n ; ++i )
		c[i]=INF;
}

void check( int x )
{
	for( int i=0 ; i<s[x] ; ++i )
		if(!st[N] && c[x]+v[x][i].cc < c[ v[x][i].to ] )
		{
			c[v[x][i].to]=c[x]+v[x][i].cc;
			p.insert( mp( c[ v[x][i].to ],v[x][i].to) );
		}
}

void dk()
{
	pair<int,int> x;
	p.insert( mp(0,1) );
	while( !p.empty() )
	{
		st[beg.index]=1;
		check(beg.index);
		p.erase(p.begin());
	}
}

void print()
{
	for( int i=2 ; i<=n ; ++i )
		printf("%d ",( c[i]==INF ? 0 : c[i] ) );
	printf("\n");
}

int main()
{
	freopen("dijkstra.in","r",stdin);
	freopen("dijkstra.out","w",stdout);
	read();
	ini();
	dk();
	print();
	return 0;
}