Cod sursa(job #702172)

Utilizator MattAldea Matei Matt Data 1 martie 2012 20:04:26
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>
FILE *in = fopen("dijkstra.in","r"), *out = fopen("dijkstra.out","w");
int const inf=2000;
int n,a[100][100],s[100],t[100],c[100],i,j,m,o,p,q;
void citire()
{ 
fscanf(in, "%d %d", &n, &m);
for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
		{ if(i!=j) a[i][j]=2000;
			else a[i][j]=0; }
for(i=1;i<=m;i++)
{		fscanf(in, "%d %d %d", &o, &p, &q); // A B C lungimea de la A la B e C
		a[o][p]=q; a[p][o]=q;}
}
void dijkstra(int z)
{ int min;
int k=0;;
for(i=1;i<=n;i++) { c[i]=a[z][i]; t[i]=z; s[i]=0; }
t[z]=0;
s[z]=1;
for(j=1;j<=n-1;j++) { min=inf;
	for(i=1;i<=n;i++)  if(s[i]==0 && c[i]<min){ min=c[i]; k=i; }
	s[k]=1;
	for(i=1;i<=n;i++)  if(s[i]==0 && c[i]>c[k]+a[k][i]) { c[i]=c[k]+a[k][i]; t[i]=k; }
				  }
}
void afis(int x)
{ for(i=2;i<=n;i++)
	 if(t[i]!=0) fprintf(out, "%d ", c[i]);
		else if(t[i]==0) fprintf(out, "%d ", 0); 
}
int main()
{ citire();
dijkstra(1);
afis(1);
return 0;
}