Cod sursa(job #718399)

Utilizator lunat1cHobinca Bogdan lunat1c Data 20 martie 2012 19:26:37
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#define INF 2000000000

using namespace std;

int a[5000][5000], d[5000], t[5000], viz[5000], n, m;

void citire()
{
	freopen("dijkstra.in", "r", stdin);
	scanf("%d%d", &n, &m);
	int x, y, c;
	for(int i=1; i<=m; i++)
	{
		scanf("%d%d%d", &x, &y, &c);
		a[x][y]=c;
	}
	for(int i=1; i<=n; i++)
		for(int j=1; j<=n; j++)
		{
			if(a[i][j]==0) a[i][j]=INF;
			if(a[j][i]==0) a[j][i]=INF;
		}

	// initializare

	for(int i=2; i<=n; i++)
	{
		d[i]=a[1][i];
		if(d[i]!=INF) t[i]=1;
	}
	viz[1]=1;
}

void dijkstra()
{
	int min=INF, nod, k=1, i;
	bool ok = true;
	while(ok)
	{
		min=INF;
		for(i=2; i<=n; i++)
			if(d[i]<min && !viz[i]) min = d[i], nod=i;
		if(min==INF)
		{
			ok=0;
			break;
		}
		viz[nod]=1;
		k++;
		for(i=2; i<=n; i++)
		{
			if(d[i]>d[nod]+a[nod][i])
			{
				d[i]=d[nod]+a[nod][i];
				t[i]=nod;
			}
		}
		if(k==n) ok=0;
	}
}

int main()
{
    citire();
    dijkstra();
    freopen("dijkstra.out", "w", stdout);
    for(int i=2; i<=n; i++)
		printf("%d ", d[i]);
    return 0;
}