Cod sursa(job #490254)

Utilizator DanutzRusu Dan Andrei Danutz Data 5 octombrie 2010 18:15:24
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#define inf 10000
int c[100][100],d[100],t[100],s[100],r,n,m;
FILE *f,*g;
void cit(){
	int i,j,x,y;
	f=fopen("dijkstra.in","r");
	fscanf(f,"%d %d",&n,&m);
	fscanf(f,"%d",&r);
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			if (i!=j)
				c[i][j]=inf;
	for (i=1;i<=n;i++)
	{
		fscanf(f,"%d %d %d",&x,&y,&j);
		c[x][y]=c[y][x]=j;
	}
	fclose(f);
}

void solve(){
	int i,j,k,i0;
	int min;
	for (i=1;i<=n;i++)
	{ d[i]=c[r][i];
	 t[i]=r;
	 s[i]=0;
	}
	t[r]=0;
	d[r]=0;
	s[r]=1;
	for (k=1;k<=n-1;k++)
	{
		min=inf;
		for (i=1;i<=n;i++)
			if (s[i]==0&&d[i]<min)
			{ i0=i; min=d[i]; }
	    s[i0]=1;
		for (i=1;i<=n;i++)
			if (min+c[i0][i]<d[i])
			{ d[i]=min+c[i0][i];
			  t[i]=i0;
			}
	}
	
	for (i=2;i<=n;i++)
		fprintf(g,"%d ",d[i]);
	fputc('\n',g);
}

/*void afis(int i){
	if (t[i]==0)
	{ fprintf(g,"%d ",i); return ;}
	afis(t[i]);
	fprintf(g,"%d ",i);
}*/


int main(){
	cit();
	g=fopen("dijkstra.out","w");
	solve();
	//afis(3);
	fclose(g);
    return 0;
}