Mai intai trebuie sa te autentifici.
Cod sursa(job #2683784)
Utilizator | Data | 12 decembrie 2020 09:49:57 | |
---|---|---|---|
Problema | Algoritmul Bellman-Ford | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.32 kb |
#include <fstream>
#include <queue>
#include <vector>
#define NMAX 50005
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("bellmanford.in");
ofstream g("bellmanford.out");
int n, m;
int dmin[NMAX], decateori[NMAX], viz[NMAX];
struct nod{
int y, cost;
};
vector<nod>graph[NMAX];
queue<int> Q;
void init(){
for(int i=1; i<=n; i++)
dmin[i] = NMAX*1000;
}
void citire(){
f>>n>>m;
int x, y, cost;
for(int i=0; i<m; i++){
f>>x>>y>>cost;
graph[x].push_back({y, cost});
}
}
void bellman_ford(int vf){
Q.push(vf);
viz[vf] = 1;
dmin[vf] = 0;
while(!Q.empty()){
int v = Q.front();
Q.pop();
viz[v] = 0;
for(auto &el:graph[v])
if(dmin[el.y] > dmin[v] + el.cost){
dmin[el.y] = dmin[v] + el.cost;
if(viz[el.y] == 0)
Q.push(el.y);
viz[el.y] = 1;
decateori[el.y]++;
if(decateori[el.y] > n){
g<<"Ciclu negativ!";
exit(0);
}
}
}
}
void afisare(){
for(int i=2; i<=n; i++)
g<<dmin[i]<<" ";
}
int main()
{
citire();
init();
bellman_ford(1);
afisare();
return 0;
}