Pagini recente » Cod sursa (job #31254) | Cod sursa (job #704091)
Cod sursa(job #704091)
#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();
}