Pagini recente » Cod sursa (job #2952103) | Cod sursa (job #2870805) | Cod sursa (job #1191371) | Cod sursa (job #2638951) | Cod sursa (job #2203069)
#include <fstream>
#include <vector>
#define nmax 50005
#define mmax 250005
#define inf 2000000000
using namespace std;
fstream f1("bellmanford.in", ios::in);
fstream f2("bellmanford.out", ios::out);
int n, m, viz[nmax], coada[mmax], prim, ultim, k, dist[nmax], pred[nmax], iter[nmax], ok=1;
vector<pair<int, int> > v[nmax];
void citire()
{
int i, x, y,c;
f1>>n>>m;
for(i=1; i<=m; i++)
{
f1>>x>>y>>c;
v[x].push_back({y,c});
///v[y].push_back({x,c});
}
}
void solutie()
{
int i, nod, vec, ct;
viz[1]=1;
prim=ultim=k=1;
coada[prim]=1;
for(i=2; i<=n; i++)
dist[i]=inf;
while((k!=0)&&(ok))
{
nod=coada[prim]; viz[nod]=0; prim++; k--;
if(prim> mmax-2) prim=1;
for(auto it=v[nod].begin(); it!=v[nod].end(); ++it)
if((dist[(*it).first]> dist[nod]+ (*it).second)&&(dist[nod]!=inf))
{
vec=(*it).first; ct=(*it).second;
dist[vec]= dist[nod]+ct;
pred[vec]=nod;
if(!viz[vec])
{
k++; ultim++; if(ultim>mmax-2) ultim=1; coada[ultim]=vec;
viz[vec]=1;
iter[vec]++;
if(iter[vec]> n) ok=0;
}
}
}
}
void afis()
{
int i;
if(!ok) f2<<"Ciclu negativ!";
else
{
for(i=2; i<=n; i++)
f2<<dist[i]<<' ';
}
}
int main()
{
citire();
solutie();
afis();
return 0;
}