Cod sursa(job #199453)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 18 iulie 2008 21:02:50
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include<stdio.h>
#include<limits.h>

#define INF INT_MAX/2

#define NMAX 1210
#define MMAX 250000
/*
#define NMAX 10
#define MMAX 250
  */
struct arc{unsigned short a,b,c;};

int main(){
freopen("dijkstra.in","r",stdin);
freopen("dijkstra.out","w",stdout);
int i,j,k,x,y,nrsel,gata;
int n,m;
int c[NMAX+1][NMAX+1],min;
unsigned short s[NMAX+1],prec[NMAX+1],start=1;
int d[NMAX+1];
arc va[MMAX];
scanf("%d%d",&n,&m);
for(i=0;i<m;++i) scanf("%hu%hu%hu",&va[i].a,&va[i].b,&va[i].c);
for(i=1;i<=n;++i)
	for(j=1;j<=n;++j) c[i][j]=INF;
for(i=1;i<=n;++i) c[i][i]=0;
for(i=0;i<m;++i){
	x=va[i].a;y=va[i].b;
	c[x][y]=va[i].c;
	}
for(i=2;i<=n;++i){
	d[i]=c[start][i];
	s[i]=0;
	if(d[i]<INF) prec[i]=start;
	else prec[i]=0;
	}
s[1]=1;prec[1]=0;
nrsel=1;gata=0;
do{
	 min=INF*2;
	 for(i=2;i<=n;++i)
		if(!s[i]&&d[i]<min){
			min=d[i];
			k=i;
			}
	 nrsel++;
	 if(d[k]==INF||nrsel==n) gata=1;
	 else{
		s[k]=1;
		for(j=2;j<=n;++j)
			if(!s[j]&&d[j]>d[k]+c[k][j]){
				d[j]=d[k]+c[k][j];
				prec[j]=k;
				}
		}
	 }while(!gata);

for(i=2;i<=n;++i)
	if(d[i]==INF) printf("0 ");
	else printf("%d ",d[i]);
return 0;
}