Cod sursa(job #228641)

Utilizator RebelulDonea Ovidiu Rebelul Data 7 decembrie 2008 17:52:09
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
// http://infoarena.ro/problema/dijkstra  Punctaj:
#include <fstream.h>

const float Pinf=1.e20;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");

int n,m,k,t[100],s[100];
float a[100][100],d[100];
	
void citire()
{
	int x,y;
	float c;
	fin>>n>>m;
	for(int i=1;i<=n;i++)
	{
	 for(int j=1;j<=n;j++)
	   a[i][j]=Pinf;
	 a[i][i]=0;
        }
	for(i=1;i<=m;i++)
	{
		fin>>x>>y>>c;
		a[x][y]=c;
	}	
}	
	
void dijkstra(int x)
{
	float min=Pinf;
	s[x]=1;
	for(int i=1;i<=n;i++)
	{
		d[i]=a[x][i];
		if(d[i]!=0 && d[i]!=Pinf)
			t[i]=x;
	}	
	for(i=1;i<n;i++)
	{
		min=Pinf;
		for(int j=1;j<=n;j++)
			if(d[j]<min && s[j]!=1 && d[j]!=0)
			{
				min=d[j];
				k=j;
			}
		s[k]=1;
		for(j=1;j<=n;j++)
			if(s[j]!=1 && d[j]>d[k]+a[k][j])
			{
				d[j]=d[k]+a[k][j];
				t[j]=k;
			}
	}		
}

void afisare()
{
	for(int i=2;i<=n;i++)
		if(d[i]!=Pinf)
		 fout<<d[i]<<' ';
		else fout<<0<<' ';
}	
int main()
{
  citire();
	dijkstra(1);
	afisare();
	return 0;
}