From ba1994647e76889ef2cb4607f541d0088c3f62e2 Mon Sep 17 00:00:00 2001 From: Chinakrit Lorpiyanon Date: Thu, 31 Oct 2019 13:50:22 +0700 Subject: [PATCH] Add BellmanFord Algorithm for CPP --- CPP/BellmanFord.cpp | 94 +++++++++++++++++++++++++++------------------ 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/CPP/BellmanFord.cpp b/CPP/BellmanFord.cpp index a985ecd..c5ffbae 100644 --- a/CPP/BellmanFord.cpp +++ b/CPP/BellmanFord.cpp @@ -1,43 +1,61 @@ -//saru95 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define all(a) (a).begin(),(a).end() -#define gcd __gcd -#define bitcount __builtin_popcount +#include +#include + +#define INF 100000000 using namespace std; - -typedef std::vector vi; -typedef std::vector vs; -typedef std::pair pii; -typedef std::set si; -typedef std::map msi; - - + +typedef struct edge { + int u, v, w; +} edge; + +vector edges; +vector dis; +bool has_negative_cycle; +int n_nodes; + +void bellmanford(int src) { + dis[src] = 0; + has_negative_cycle = false; + edge e; + for(int i = 1;i < n_nodes;i++) { + for(vector::iterator it = edges.begin();it != edges.end();it++) { + e = *it; + if(dis[e.u] != INF) { + dis[e.v] = min(dis[e.u] + e.w, dis[e.v]); + } + } + } + // detect negative cycle + for(vector::iterator it = edges.begin();it != edges.end() && !has_negative_cycle;it++) { + e = *it; + if(dis[e.u] != INF && dis[e.u] + e.w < dis[e.v]) { + has_negative_cycle = true; + } + } +} int main(int argc, char const *argv[]) { - - return 0; + int n_edges, u, v, w; + cin >> n_nodes; + dis.assign(n_nodes, INF); + cin >> n_edges; + while(n_edges--) { + cin >> u >> v >> w; + edges.push_back({u, v, w}); + } + // input source node + cin >> u; + bellmanford(u); + if(has_negative_cycle) { + cout << "Negative cycle detected" << endl; + } + else { + cout << "No negative cycle detected" << endl; + for(int i = 0;i < n_nodes;i++) { + cout << i << ": " << dis[i] << endl; + } + } + + return 0; }