Cod sursa(job #705042)

Utilizator Aleks10FMI - Petrache Alex Aleks10 Data 2 martie 2012 23:39:13
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include<cstdio>
long long inf=16000;
long long a[15000][15000],n,m,d[600000],s[600000],prec[600000],xp;




void citire(){
	freopen("dijkstra.in", "r", stdin);
	//ifstream f("dijkstra.in");
	int i,j,x,y,z;
	//f>>n>>m;
	scanf("%d %d", &n, &m);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
			a[i][j]=inf;
		a[i][i]=0;
	}
	for(i=1;i<=m;i++){
		//f>>x>>y>>a[x][y];
		scanf("%d %d %d", &x, &y, &z);
		a[x][y]=z;
	}
	//cout<<"Varful de plecare=";
	//cin>>xp;
	xp=1;
}

void initd(){
	int i;
	prec[xp]=0;
	s[xp]=1;
	for(i=1;i<=n;i++){
		d[i]=a[xp][i];
		if(a[xp][i]!=0 && a[xp][i]!=inf)
			prec[i]=xp;
	}
}

void drum(int i){
	//ofstream g("dijkstra.out");
	freopen("dijkstra.out", "w", stdout);
	if(i!=0){
		drum(prec[i]);
		printf("%d ", i);
		//g<<i<<" ";
	}
}

void afisare(){
	//ofstream g("dijkstra.out");
	freopen("dijkstra.out", "w", stdout);
	int xf;
	for(xf=1;xf<=n;xf++)
		if(d[xf]!=inf&&d[xf]!=0){
			//f<<"Costul drumului min de la "<<xp<<" la "<<xf<<" este:"<<d[xf]<<"\n";
			//g<<d[xf]<<" ";
			printf("%d ", d[xf]);
			
			//f<<"Drumul dintre "<<xp<<" si "<<xf<<" este:";
			//drum(xf);
			//f<<"\n";
		}
}

int minim(){
	int min,i,p;
	min=inf;
	p=1;
	for(i=1;i<=n;i++)
		if(s[i]==0&&d[i]<min){
			min=d[i];
			p=i;
		}
		return p;
}

void dijkstra(){
	int x,i,k;
	x=0;
	do{
		x++;
		k=minim();
		s[k]=1;
		for(i=1;i<=n;i++)
			if(s[i]==0&&d[i]>d[k]+a[k][i]&&a[k][i]>0&&a[k][i]<inf){
				prec[i]=k;
				d[i]=d[k]+a[k][i];
			}
	}while(x!=n&&d[k]!=inf);
}
int main(){
	citire();
	initd();
	dijkstra();
	afisare();
}