Cod sursa(job #701530)

Utilizator Oancea.CatalinOancea Catalin Oancea.Catalin Data 1 martie 2012 16:22:28
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<fstream>
using namespace std;
#define IN "dijkstra.in"
#define OUT "dijkstra.out"
#define INF 1000000
#define MaxN 10001
FILE *f, *g;
int i, j, x, y, cost, a[MaxN][MaxN], d[MaxN], t[MaxN], viz[MaxN], n, m;
void DIJ(int start)
{
	int i, j, w, minim=INF;
	
	for(i=1; i<=n; i++)
	{
		if(i!=start)
			d[i]=a[i][start];
		if(d[i]!=0 && d[i]!=INF)
			t[i]=start;
	}
	d[start]=0;
	viz[start]=1;
	t[start]=0;
	for(j=1; j<=n; j++)
	{
		minim=INF;
		for(i=1; i<=n; i++)
		{
			if(viz[i]==0)
				if(d[i]<minim)
				{
					minim=d[i];
					w=i;
				}
		}
		viz[w]=1;
		for(i=1; i<=n; i++)
		{
			if(d[i]>minim+a[i][w])
			{
				d[i]=minim+a[i][w];
				t[i]=w;
			}
		}
	}
}
int main()
{
	f=fopen(IN, "r"); g=fopen(OUT, "w");
	fscanf(f, "%d %d", &n, &m);
	for(i=1; i<=n; i++)
	{
		for(j=i+1; j<=n; j++)
			a[i][j]=a[j][i]=INF;
	}
	for(i=1; i<=m; i++)
	{
		fscanf(f, "%d %d %d", &x, &y, &cost);
		a[x][y]=a[y][x]=cost;
	}
	DIJ(1);
	for(i=2; i<=n; i++)
	{
		if(d[i]!=INF)
			fprintf(g, "%d ", d[i]);
		else
			fprintf(g, "0 ");
	}
	fprintf(g, "\n");
	fclose(f);
	fclose(g);
	return 0;
}