Pagini recente » Istoria paginii runda/simulare_oji_11_12_3 | Cod sursa (job #446592) | Cod sursa (job #421649) | Cod sursa (job #2363574) | Cod sursa (job #705040)
Cod sursa(job #705040)
#include<cstdio>
int inf=16000;
int a[50][50],n,m,d[50],s[50],prec[50],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();
}