最短路_Bellman-Ford
2014-07-27 23:15
218 查看
Bellman-Ford,感觉不是很好用,边的数目已多就容易超时,但因其可以处理负权图,所以也要会。
循环n-1次,因为图中有N个点,说以最短路最多有n-1条边。而每次循环至少松弛一条边。
1.初始化dis数组,d[s]=0;s为起点;
2.对每一条边e(u,v,w)进行d[e.v]=min(d[e.v],d[e.u]+e.w) -> 松弛操作;
3.重复进行(最多n-1次)2步骤,直到d[i]的值没有更新为止;
4.判断负环。结束3步骤后,在执行一遍2步骤,判断d[e.v]>d[e.u]+e.w,但不进行更新,如果有一条边为真,则说明存在负环,即无法求最短路。
Bellman-Ford有个优化叫SPFA还没学。下次再补
循环n-1次,因为图中有N个点,说以最短路最多有n-1条边。而每次循环至少松弛一条边。
1.初始化dis数组,d[s]=0;s为起点;
2.对每一条边e(u,v,w)进行d[e.v]=min(d[e.v],d[e.u]+e.w) -> 松弛操作;
3.重复进行(最多n-1次)2步骤,直到d[i]的值没有更新为止;
4.判断负环。结束3步骤后,在执行一遍2步骤,判断d[e.v]>d[e.u]+e.w,但不进行更新,如果有一条边为真,则说明存在负环,即无法求最短路。
struct Edge { inr u,v; int w; }ed[MAX]; //记录边 int dis[MAX]; bool Bellman_Ford (){ for (int i=0;i<n;i++){ //初始化 dis[i]=INF; } bool flag; for (int i=0;i<n-1;i++){//n-1次循环 flag=false; for (int j=0;j<2*m+w;j++){ if (dis[ed[j].v]>dis[ed[j].u]+ed[j].w){ //松弛操作 dis[ed[j].v]=dis[ed[j].u]+ed[j].w; flag=true; } } if (flag==false) break; } flag=0; for (int j=0;j<2*m+w;j++){ //判断负环 if (dis[ed[j].v]>dis[ed[j].u]+ed[j].w){ flag=1; } } return flag; }
Bellman-Ford有个优化叫SPFA还没学。下次再补
相关文章推荐
- 图论浅析--最短路之Bellman-Ford
- AtCoder Beginner Contest 061 D - Score Attack(最短路变形,Bellman-Ford最短路算法)
- poj 2240 Arbitrage (最短路 bellman_ford)
- 最短路 bellman-ford
- 最短路(2)--bellman-ford和SPFA
- Frogger POJ - 2253 最短路变形 Bellman-Ford
- HDU-#2544 最短路(Dijkstra、Floyd、Bellman-Ford、SPFA)
- HDOJ 2544 最短路(Bellman-Ford 模板题)
- Bellman_ford最短路
- 带负权的最短路bellman_ford——POJ 3259 Wormholes题解
- hdu 1874(最短路Bellman_Ford)
- NBUT 1221 Intermediary(Bellman-Ford)(最短路三进制状态压缩)
- 暑假-最短路(Bellman-ford、spfa)-E - Silver Cow Party
- 图论最短路之bellman-ford
- Bellman-Ford(最短路)
- hdu 2544 最短路 Bellman_Ford 解题报告
- POJ1860--Currency Exchange(最短路Bellman_Ford)
- 【最短路】poj3259-Wormholes(Bellman-Ford 最短路)
- Bellman-Ford,最短路(在环中,UVA 11090)
- 最短路之bellman-ford