一、单源最短路问题
-
Bellman-Ford算法:O(|V|×|E|)
(浪费时间,遍历每一条边的时候不知道当前边的de.from是不是正确的最短距离; 而且对于每个点都要遍历一次该点的相连边)
从起点到第i个点的最短距离di = min{dj + wij | j与i相邻} (所有(到点i相邻的点(j)的最小距离 + 这两个点的距离)中的最小值)实现方法:存边的to, distance,初始化最短路径数组d[]为INF。按点遍历,每个点遍历一次所有的相连边。
di 就是de.to
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <climits>
using namespace std;
struct edge
{
int to, cost;
edge(int _to, int _d) :to(_to), cost(_d) {
};
};
const int MAXV = 100;
vector<edge> g[MAXV];
vector<edge>::iterator it;
int d[MAXV];
const int INF = INT_MAX;
void BellmanFord(int v) {
bool update;
do {
update = false;
for (int j = 1;j <= v;j++) {
for (it = g[j].begin(); it != g[j].end(); it++) {
edge e = *it;
int i = e.to;
if (d[j] != INF && d[j] + e.cost < d[i]) {
d[i] = d[j] + e.cost;
update = true;
}
}
}
} while (update);
}
bool negative_BellmanFord(int v, int start) {
bool update;
do {
update = false;
for (int j = 1; j <= v; j++) {
for (it = g[j].begin(); it != g[j].end(); it++) {
edge e = *it;
int i = e.to;
if (d[j] != INF && d[j] + e.cost < d[i]) {
d[i] = d[j] + e.cost;
update = true;
}
}
}
if (d[start] < 0) return true;
} while (update);
return false;
}
void addEdge(const int &f, const int &t, const int &cost) {
g[f].push_back(edge(t, cost));
}
int main() {
int v = 4;
addEdge(1, 2, 1);
addEdge(2, 3