北京做网站制作的公司哪家好,广州做网站公司电话,微网站中定位功能怎么做的,晋江网站建设联系电话B e l l m a n — F o r d Bellman—Ford Bellman—Ford是一种单源最短路径算法#xff0c;可以用于边权为负的图#xff0c;但是只能用于小图。
大概过程#xff1a;
枚举每一条边#xff0c;更新可以更新的节点#xff08;起点到自己距离为 0 0 0#xff0c;从地点开… B e l l m a n — F o r d Bellman—Ford Bellman—Ford是一种单源最短路径算法可以用于边权为负的图但是只能用于小图。
大概过程
枚举每一条边更新可以更新的节点起点到自己距离为 0 0 0从地点开始向外。重复第一个步骤 n − 1 n - 1 n−1次起点不用每一轮至少有一个节点会被更新出最短路径和 D i j k s t r a Dijkstra Dijkstra中用到的贪心思想有点像。
Dijkstra传送门
算法复杂度很明显需要 n − 1 n - 1 n−1个点都需要枚举一次每次都需要枚举 m m m条边复杂度为 O ( n m ) O(nm) O(nm)。
同时这个算法还可以判断是否存在负环。只要更新完 n − 1 n - 1 n−1次后还有点可以被更新最短路那就是存在负环的因为只有负环是每走一圈路径长度都会往下减就可以无限更新而正常图我们只要枚举 n − 1 n - 1 n−1遍。
也可以记录每个节点最短路的路径。前面发过的最短路算法应该也有可以参考 B e l l m a n F o r d Bellman_Ford BellmanFord的处理办法
同样的通过例题理解代码。 【模板】Bellman-Ford算法-StarryCoding | 踏出编程第一步
题目描述 n n n点 m m m边的带负权有向图连通可能存在重边与自环求 1 1 1到所有点的单源最短路的距离。
保证结点 1 1 1可以到达所有结点。
如果图中存在负环则只输出一个整数 − 1 −1 −1。
输入描述
第一行两个整数 n , m 。 ( 2 ≤ n , m ≤ 1 × 1 0 4 ) n, m。(2 \leq n , m \leq 1 \times 10^4) n,m。(2≤n,m≤1×104)
接下来 m m m行每行一条单向边 x , y , z x,y,z x,y,z表示存在一条从 x x x到 y y y的距离为 z z z的通道。 ( 1 ≤ x , y ≤ n , − 1 0 9 ≤ z ≤ 1 0 9 ) (1 \leq x, y \leq n, -10^9 \leq z \leq 10^9) (1≤x,y≤n,−109≤z≤109)
输出描述
一行 n n n个整数第 i i i个整数表示从点 1 1 1到点 n n n的最短距离。
如果图中存在负环则只输出一个整数 − 1 −1 −1。
输入样例1
5 5
1 2 1
2 3 -2
3 4 1
4 5 6
1 5 -5输出样例1
0 1 -1 0 -5解
#includebits/stdc.h
using namespace std;
const int N 2e5 9;
using ll long long;
const ll inf 2e18;struct Edge
{int x;ll w;
};int n, m;
vectorEdge g[N];
ll d[N];
//记录前驱节点用于打印路径。
// int pre[N];void print(int s, int t) //打印路径用的
{if(s t){cout s ;return;}print(s, pre[t])cout t ;
}void solve()
{cin n m;for(int i 1; i m; i){int u, v;ll w; cin u v w;g[u].push_back({v, w});}//d[i]表示从起点到点i的距离。for(int i 1; i n; i) d[i] inf;d[1] 0;bool circle; //判断负环最后一次出来之后还是true就是一直在更新有负环for(int i 1; i n; i) //枚举n遍{circle false;for(int x 1; x n; x) //枚举每天边{for(auto [y, w] : g[x]){if(d[x] w d[y]) //如果能更新{d[y] d[x] w;// pre[x] y; 如有需要记录路径circle true;}}}}if(circle) cout -1 \n;else{for(int i 1; i n; i) cout d[i] ;}
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _ 1;while(_--) solve();return 0;
}易错提醒还是别忘记初始化别忘记初始化别忘记初始化。 P S PS PS:这个代码过不了这个例题数据范围略大需要优化成 s p f a spfa spfa算法。