//
// main.cpp
// Demo
//
// Created by Longxiang Lyu on 8/9/16.
// Copyright (c) 2016 Longxiang Lyu. All rights reserved.
//
#include <iostream>
#include <string>
#include <memory>
#include <vector>
#include <stdexcept>
class Edge;
class Graph;
using namespace std;
class Edge
{
friend class Graph;
private:
int src;
int dest;
int weight;
public:
Edge() = default;
Edge(int s, int d, int w) : src(s), dest(d), weight(w) {}
};
class Graph
{
private:
int V;
vector<Edge> *edges;
public:
Graph() = default;
Graph(int v) : V(v) { edges = new vector<Edge>(); }
void addEdge(int s, int d, int w)
{
edges->push_back(Edge(s, d, w));
}
void bellmanFord(vector<int> &dist, int src)
{
// set up the distance array
dist.clear();
dist.resize(V, INT_MAX);
dist[src] = 0;
// relaxation for |V| - 1 times
for (int i = 1; i != V; ++i)
{
for (auto it = edges->begin(); it != edges->end(); ++it)
{
int u = (*it).src;
int v = (*it).dest;
int w = (*it).weight;
if (dist[u] != INT_MAX && dist[u] + w < dist[v])
dist[v] = dist[u] + w;
}
}
// check for negative cycle
for (auto it = edges->begin(); it != edges->end(); ++it)
{
int u = (*it).src;
int v = (*it).dest;
int w = (*it).weight;
if (dist[u] != INT_MAX && dist[u] + w < dist[v])
throw runtime_error("Negative Weight Cycle Exist!");
}
}
};
int main()
{
Graph graph(5);
graph.addEdge(0, 1, -1);
graph.addEdge(0, 2, 4);
graph.addEdge(1, 2, 3);
graph.addEdge(1, 3, 2);
graph.addEdge(1, 4, 2);
graph.addEdge(3, 2, 5);
graph.addEdge(3, 1, 1);
graph.addEdge(4, 3, -3);
vector<int> dist;
graph.bellmanFord(dist, 0);
for (auto a : dist)
cout << a << " ";
cout << endl;
return 0;
}
Bellman-ford algorithm to find the shortest path
原文作者:Bellman - ford算法
原文地址: https://blog.csdn.net/KusanoNEU/article/details/52168863
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/KusanoNEU/article/details/52168863
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。