Mai intai trebuie sa te autentifici.
Cod sursa(job #1925574)
| Utilizator | Data | 13 martie 2017 13:41:56 | |
|---|---|---|---|
| Problema | Algoritmul Bellman-Ford | Scor | 100 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 1.65 kb |
#include <cstdio>
#include <list>
#include <queue>
using namespace std;
struct edge{
int v, weight;
edge(int _v, int _w){
v = _v;
weight = _w;
}
};
int vertices, edges, u, v, weight;
int dist[50001];
int visited[50001];
bool inQueue[50001];
const int infinity = 25000001;
list<edge> adj[50001];
bool BellmanFord(int source){
for(int node = 1; node <= vertices; node++){
dist[node] = infinity;
}dist[source] = 0;
queue<int> Q;
Q.push(source);
while(!Q.empty()){
int u = Q.front(); Q.pop();
inQueue[u] = false;
for(list<edge>::iterator it = adj[u].begin(); it != adj[u].end(); it++){
int v = it -> v;
int weight = it -> weight;
if(dist[v] > dist[u] + weight){
dist[v] = dist[u] + weight;
visited[v]++;
if(inQueue[v] == false){
inQueue[v] = true;
Q.push(v);
}
if(visited[v] == vertices){
return false;
}
}
}
}
return true;
}
int main(){
freopen("bellmanford.in", "r", stdin);
freopen("bellmanford.out", "w", stdout);
scanf("%d %d", &vertices, &edges);
for(int i = 1; i <= edges; i++){
scanf("%d %d %d", &u, &v, &weight);
adj[u].push_back(edge(v, weight));
}
if(BellmanFord(1) == false){
printf("Ciclu negativ!");
return 0;
}
for(int node = 2; node <= vertices; node++){
printf("%d ", dist[node]);
}
return 0;
}
