Cod sursa(job #704091)

Utilizator Aleks10FMI - Petrache Alex Aleks10 Data 2 martie 2012 16:22:14
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<iostream>
#include<fstream>
int inf=16000;
int a[50][50],n,m,d[50],s[50],prec[50],xp;
ofstream g("dijkstra.out");

void citire(){
	ifstream f("dijkstra.in");
	int i,j,x,y;
	f>>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];
	//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){
	if(i!=0){
		drum(prec[i]);
		g<<i<<" ";
	}
}

void afisare(){
	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]<<" ";
			//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();
}