Pagini recente » Cod sursa (job #2359022) | Cod sursa (job #1890292) | Cod sursa (job #193999) | Cod sursa (job #1411774) | Cod sursa (job #2547003)
#include<fstream>
#include<vector>
#include<queue>
#define MAX_V 50000
#define oo 0x3f3f3f3f
using namespace std;
vector<pair<int, int>>g[MAX_V + 1];
int dmin[MAX_V + 1], nr[MAX_V + 1], n, m;
bool used[MAX_V + 1], ncycle;
void readGraph() {
int x, y, c;
ifstream fin("bellmanford.in");
fin >> n >> m;
for(int i = 1; i <= m; i++) {
fin >> x >> y >> c;
g[x].push_back({y, c});
}
fin.close();
}
void BellmanFord(int source) {
int node;
queue<int>q;
for(int i = 1; i <= n; i++)
dmin[i] = oo;
dmin[source] = 0;
q.push(source);
used[source] = true;
ncycle = false;
while(!q.empty() && !ncycle) {
node = q.front();
used[node] = false;
q.pop();
for(auto i : g[node]) {
if(dmin[i.first] > dmin[node] + i.second) {
dmin[i.first] = dmin[node] + i.second;
if(!used[i.first]) {
q.push(i.first);
used[i.first] = true;
if(++nr[i.first] > n)
ncycle = true;
}
}
}
}
}
void printDistances() {
ofstream fout("bellmanford.out");
if(ncycle)
fout << "Ciclu negativ!\n";
else {
for(int i = 2; i <= n; i++)
fout << dmin[i] << " ";
fout << "\n";
}
fout.close();
}
int main() {
readGraph();
BellmanFord(1);
printDistances();
return 0;
}