Cod sursa(job #443011)

Utilizator mottyMatei-Dan Epure motty Data 15 aprilie 2010 21:17:04
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
#include<vector>
#include<set>
#define beg (*s.begin())
#define mp make_pair
#define pb push_back

using namespace std;

const int N=50001,INF=1000000000;

int n,m,d[N],len[N];

vector < int > g[N],c[N];

set< pair<int,int> > s;

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

void read()
{
	int x,y,z;
	
	scanf("%d%d",&n,&m);
	
	for( int i=1 ; i<=m ; ++i )
	{
		scanf("%d%d%d",&x,&y,&z);
		++len[x];
		g[x].pb(y);
		c[x].pb(z);
	}
	
	ini();
}

void check( int cost , int nod )
{
	for( int i=0 ; i<len[nod] ; ++i )
		if( cost + c[nod][i] < d[ g[nod][i] ] )
		{
			d[ g[nod][i] ] = cost + c[nod][i];
			s.insert( mp( d[ g[nod][i] ] , g[nod][i] ) );
		}
}

void parc()
{
	s.insert( mp(0,1) );
	
	while( !s.empty() )
	{
		check( beg.first , beg.second );
		s.erase(beg);
	}
}

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

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