Pagini recente » Cod sursa (job #1058861) | Cod sursa (job #2198076) | Cod sursa (job #1173150) | Cod sursa (job #264429) | Cod sursa (job #1378891)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("bellmanford.in");
ofstream out("bellmanford.out");
int n, m, nr, lst[50005], urm[250005], vf[250005], q[50005], cost[250005], contor[50005], ca;
bool viz[50005], negativ;
long long d[500005];
void adauga( int x, int y, int z)
{
vf[++nr]=y;
cost[nr]=z;
urm[nr]=lst[x];
lst[x]=nr;
}
void bellmanford ( int x )
{
int p=1, u=0, poz, y;
d[x]=0;
viz[x]=true;
contor[x]=1+contor[x];
q[++u]=x;
while(p<=u && !negativ)
{
x=q[p++];
viz[x]=false;
poz=lst[x];
while(poz!=0)
{
y=vf[poz];
ca=cost[poz];
if((d[x]+ca)<d[y])
{
d[y]=ca+d[x];
if(!viz[y])
{
q[++u]=y;
viz[y]=true;
contor[y]++;
if(contor[y]==n)
{
negativ=true;
break;
}
}
}
poz=urm[poz];
}
}
}
int main()
{
int a,b,c;
in>>n>>m;
for(int i=1;i<=m;i++)
{
in>>a>>b>>c;
adauga(a, b, c);
}
for(int i=1;i<=n;i++)
{
d[i]=999999999;
}
bellmanford(1);
if(negativ)
out<<"Ciclu negativ!";
else
{
for(int i=2;i<=n;i++)
{
out<<d[i]<<" ";
}
}
return 0;
}