Pagini recente » Cod sursa (job #111290) | Cod sursa (job #1621729) | Cod sursa (job #1916949) | Cod sursa (job #3041892) | Cod sursa (job #1706525)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
#define N_MAX 50000
#define INFINIT 0x3F3F3F3F
vector< pair<int, int> > ad[N_MAX + 1];
vector<bool> inCoada(N_MAX + 1);
int distante[N_MAX + 1];
bool areCicluriNegative(int start, int n);
int main()
{
ifstream fin("bellmanford.in");
ofstream fout("bellmanford.out");
int n, m, x, y, c;
fin >> n >> m;
for(int i = 1; i <= n; ++i)
distante[i] = INFINIT;
for(int i = 1; i <= m; ++i){
fin >> x >> y >> c;
ad[x].push_back(make_pair(y, c));
}
if(areCicluriNegative(1, n))
fout << "Ciclu negativ!";
else{
for(int i = 2; i <= n; ++i)
fout << distante[i] << " ";
}
return 0;
}
bool areCicluriNegative(int start, int n){
queue<int> q;
int ramas = n * (n - 1);
distante[start] = 0;
q.push(start);
while(!q.empty() && ramas--){
start = q.front();
q.pop();
inCoada[start] = false;
for(auto vecin : ad[start]){
if(distante[vecin.first] > distante[start] + vecin.second){
distante[vecin.first] = distante[start] + vecin.second;
if(!inCoada[vecin.first]){
q.push(vecin.first);
inCoada[vecin.first] = true;
}
}
}
}
return ramas < 0;
}