Pagini recente » Cod sursa (job #2281673) | Cod sursa (job #889033) | Cod sursa (job #1238385) | Cod sursa (job #864924) | Cod sursa (job #3355547)
#include <fstream>
#include <vector>
#include <queue> // Aici chiar folosim coada
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
vector<pair<int,int>> adj[500005];
int distante[500005];
bool in_coada[500005]; // tine minte daca un nod este in coada
int nr_intrari[500005]; // tine minte de cate ori a intrat un nod in coada
bool spfa(int start, int n)
{
// 1. Initializare
for(int i = 1; i <= n; i++)
{
distante[i] = 1000000000;
in_coada[i] = false;
nr_intrari[i] = 0;
}
distante[start] = 0;
queue<int> q;
// Adaugam nodul de start in coada
q.push(start);
in_coada[start] = true;
nr_intrari[start] = 1;
// 2. Parcurgerea folosind coada
while(!q.empty())
{
int u = q.front();
q.pop();
in_coada[u] = false; // L-am scos, deci nu mai e in coada
for(pair<int,int> muchie : adj[u])
{
int vecin = muchie.first;
int cost = muchie.second;
if(distante[u] + cost < distante[vecin])
{
distante[vecin] = distante[u] + cost;
// Daca vecinul nu e deja in coada, il bagam
if(in_coada[vecin] == false)
{
q.push(vecin);
in_coada[vecin] = true;
nr_intrari[vecin]++; // Contorizam intrarile
// Daca un nod a intrat in coada de cel putin N ori, avem ciclu negativ!
if(nr_intrari[vecin] >= n)
{
return false;
}
}
}
}
}
return true; // Nu am gasit cicluri negative
}
int main()
{
int n, m;
f >> n >> m;
for(int i = 1; i <= m; i++)
{
int x, y, z;
f >> x >> y >> z;
adj[x].push_back({y, z});
}
if(spfa(1, n) == false)
{
g << "Ciclu negativ!";
}
else
{
for(int i = 2; i <= n; i++)
{
if(distante[i] == 1000000000)
{
g << 0 << " ";
}
else
{
g << distante[i] << " ";
}
}
}
return 0;
}