Cod sursa(job #1007941)

Utilizator pulseOvidiu Giorgi pulse Data 9 octombrie 2013 21:43:22
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#define NMAX 50002

using namespace std;

ifstream fin("dijkstra.in");ofstream fout("dijkstra.out");

int n,m,a[2000][2000],d[NMAX],s[NMAX],p[NMAX];
const int INF=NMAX;

void read  ()
{
	fin>>n>>m;
	for (int i=1; i<=n; i++)
	{
		for (int j=1; j<=m; j++)
		{
			if (i==j)
				a[i][j]=0;
			else
				a[i][j]=INF;
		}
	}
	for (int i=1, nod1, nod2, cost; i<=m; i++)
	{
		fin>>nod1>>nod2>>cost;
		a[nod1][nod2]=cost;
	}
}

void Dijkstra (int x)
{
	int i,j,minim,y;

	s[x]=1;
	for (i=1; i<=n; i++)
	{
		d[i]=a[x][i];
		if (i!=x && d[i]<INF)
		{
			p[i]=x;
		}
	}
	for (i=1; i<=n-1; i++)
	{
		for (j=1, minim=INF; j<=n; j++)
		{
			if (s[j]==0 && d[j]<minim)
			{
				minim=d[j];
				y=j;
			}
		}
		s[y]=1;
		for (j=1; j<=n; j++)
		{
			if (s[j]==0 && d[j]>d[y]+a[y][j])
			{
				d[j]=d[y]+a[y][j];
				p[j]=y;
			}
		}
	}
}


void print (int x)
{
	for (int i=2; i<=n; i++)
	{
		if (p[i]!=0)
		{
			if (d[i]==INF)
				d[i]=0;
			fout<<d[i]<<" ";
		}
	}
}

int main ()
{
	read ();
	Dijkstra (1);
	print (1);

	fin.close();fout.close();
	return 0;
}