Pagini recente » Cod sursa (job #391193) | Cod sursa (job #1770573) | Cod sursa (job #1995954) | Cod sursa (job #959799) | Cod sursa (job #1369527)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
ifstream in("bellmanford.in");
ofstream out("bellmanford.out");
struct muchie
{
int x,c;
muchie(int x=0, int c=0):
x(x),c(c)
{
}
};
int n;
vector < vector < muchie > > m;
queue < int > q;
vector < int > dist;
vector < int > nr;
vector < bool > inq;
const int inf = 2147483647;
void init()
{
m.resize(n+1);
dist.resize(n+1,inf);
nr.resize(n+1,0);
inq.resize(n+1,false);
}
void citire()
{
int i,nrm;
in>>n>>nrm;
init();
int x,y,c;
for(i=1;i<=nrm;i++)
{
in>>x>>y>>c;
m[x].push_back(muchie(y,c));
}
}
void bellmanford()
{
dist[1]=0;
q.push(1);
int nc;
vector < muchie >::iterator it;
bool ciclu = false;
inq[1]=true;
while(q.size()&&!ciclu)
{
nc=q.front();
q.pop();
inq[nc]=false;
for(it=m[nc].begin(); it!=m[nc].end();it++)
{
if(dist[it->x]>dist[nc]+it->c)
{
dist[it->x]=dist[nc]+it->c;
if(!inq[it->x])
{
if(nr[it->x]>n)
ciclu=true;
else
{
q.push(it->x);
nr[it->x]++;
inq[it->x]=true;
}
}
}
}
}
if(ciclu)
dist[1]=-1;
}
void afisare()
{
if(dist[1]==-1)
out<<"Ciclu negativ!";
else
for(int i=2;i<=n;i++)
out<<dist[i]<<' ';
}
int main()
{
citire();
bellmanford();
afisare();
return 0;
}