Pagini recente » Cod sursa (job #2167447) | Cod sursa (job #1226470) | Cod sursa (job #863100) | Cod sursa (job #1226518) | Cod sursa (job #862023)
Cod sursa(job #862023)
#include <fstream>
#define Infinit 1000
using namespace std;
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n,m,start,val,ok;
int viz[50001],cmin[50001],tata[50001];
int c[5001][5001],v[5001];
void citire();
void init();
void dijkstra();
int bellman_ford(int vf);
void detdrum(int k);
void afisare();
int main()
{
citire();
init();
bellman_ford(1);
afisare();
fout.close();
return 0;
}
void citire()
{
int i,x,y,cost,j;
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(i!=j) c[i][j]=Infinit;
for(i=1;i<=m;i++)
{
fin>>x>>y>>cost;
c[x][y]=cost;
}
}
void init()
{
int i;
for (i=1;i<=n;i++)
{
tata[i]=0; cmin[i]=Infinit;
}
}
int bellman_ford(int vf)
{
int i,j,k;
cmin[vf]=0;
for(i=1;i<=n;i++)
{
ok=0;
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
if(cmin[j]!=Infinit&&c[j][k]!=Infinit)
if (cmin[k]>cmin[j]+c[j][k])
{
cmin[k]=cmin[j]+c[j][k];
tata[k]=j; ok=1;
}
}
return ok;
}
void afisare()
{
int i;
if(ok==1) fout<<"Ciclu negativ!";
else
for(i=2;i<=n;i++) fout<<cmin[i]<<' '; //detdrum(i);
}
void detdrum(int k)
{
int vf=k,nr=0,i;
fout<<"Costul minim pentru varful "<<k<<" : "<<cmin[k]<<'\n';
fout<<"Drumul de la vf de start "<<start<<" la vf "<<k<<" este: ";
v[++nr]=k;
while(tata[vf])
{
v[++nr]=tata[vf];
vf=tata[vf];
}
for(i=nr;i>0;i--) fout<<v[i]<<' ';
for(i=1;i<=nr;i++) v[i]=0;
fout<<'\n';
}