Cod sursa(job #280558)

Utilizator cotofanaCotofana Cristian cotofana Data 13 martie 2009 14:07:08
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>
#include <cstring>
#include <list>

using namespace std;

#define TR(c, it) for (typeof(c.begin())it=c.begin(); it!=c.end(); it++)
#define pb push_back
#define mp make_pair
#define dim 50100
#define inf 1000000000

int n, m, d[dim];
list< pair<int, int> > l[dim];
list<int> w;

void dijkstra()
{
	int i, vm, dist;
	for (i=2; i<=n; i++) d[i]=inf;
	for (i=1; i<=n; i++) w.pb(i);
	
	while (!w.empty())
	{
		typeof(w.begin()) v;
		dist=inf;
		TR(w, vv)
			if (d[*vv]<dist)
			{
				dist=d[*vv];
				vm=*vv;
				v=vv;
			}
		w.erase(v);
		
		TR(l[vm], j)
			if (d[(*j).first]>dist+(*j).second)
				d[(*j).first]=dist+(*j).second;
	}
}

int main()
{
	int a, b, cost, i;
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);
	scanf("%d %d\n", &n, &m);
	for (i=1; i<=m; i++)
	{
		scanf("%d %d %d\n", &a, &b, &cost);
		l[a].pb(mp(b, cost));
		l[b].pb(mp(a, cost));
	}
	dijkstra();
	for (i=2; i<=n; i++) printf("%d ", d[i]==inf?0:d[i]);
	return 0;
}