Pagini recente » Cod sursa (job #1261303) | Cod sursa (job #2869178) | Cod sursa (job #1265448) | Cod sursa (job #1809114) | Cod sursa (job #2807159)
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define NM 50000
using namespace std;
const int inf = 0x3f3f3f3f;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
int n,m,cst[NM],fcv[NM],i,x,y,c;
//vector costuri, vector frecventa
queue <int> q;//coada evidenta noduri tata
vector <pair<int,int>>v[NM]; //lista adiacenta + cost
int main()
{
f>>n>>m;
//cin>>n>>m;
//citesc in ordine valorile si in v[x](nodul tata) se adauga perechile (nod(fiu), cst) in liste de adiacenta
for(i=1;i<=m;i++)
{
f>>x>>y>>c;
//cin>>x>>y>>c;
v[x].push_back(make_pair(y,c));
}
// adaug in coada nodul de inceput-1
q.push(1);
//setez cu inf vectorul de costuri
for(i=2;i<=n;i++)
cst[i]=inf;
while(!q.empty())
{
x=q.front();
q.pop();//il scoatem cand relaxam muchiile aferente lui
for(int i=0;i<v[x].size();i++)
{
y=v[x][i].first;
if(cst[y]>cst[x]+v[x][i].second)
{
// pt fiecare vecin al nodului curent se actualizeaza costul minim
cst[y]=cst[x]+v[x][i].second;
q.push(y);
fcv[y]++;
//nu există cicluri negative ⇔ nu se mai fac actualizări la pasul n
if(fcv[y]>=n)
{ g<<"Ciclu negativ!";
//cout<<"ciclu negativ";
}
}
}
}
// Afisare daca nu exista costuri negative
for(i=2;i<=n;i++)
{ g<<cst[i]<<" ";
//cout<<cst[i]<<" ";
}
return 0;
}