码迷,mamicode.com
首页 > 其他好文 > 详细

Bellman-Ford

时间:2018-07-29 23:54:37      阅读:316      评论:0      收藏:0      [点我收藏+]

标签:处理   int   else   需要   turn   return   amp   struct   更新   

最短路+判负环
优点:
1.判负环比较稳(相对于spfa+dfs/bfs)
2.存图超简单
3.Bellman-Ford枚举的是边集{E},不需要考虑不联通的区块;如果写Dijkstra或SPFA,则要考虑这种情况。
缺点:专求最短路复杂度大了点O(n*m)

 

分3个部分:
1.做n-1次循环
2.每个循环中遍历所有的m条边,进行松弛。(若要记录最短路线在这里做文章,打个pre数组)
3.算完上面最短路后再枚举一次所有的m条边,若还可以继续松弛的话,说明存在负环

struct edge{
int u,v,w;
}e[N<<1];

int inf=0x7fffffff;
me(dis,inf);
dis[1]=0;

一般板子:

For(i,1,n-1)
For(j,1,m)
if(dis[e[j].u]+e[j].w<dis[e[j].v]){
dis[e[j].v]=dis[e[j].u]+e[j].w;
pre[e[j].v]=e[j].u;//打印路线
}
For(j,1,m)
if(dis[e[j].u]+e[j].w<dis[e[j].v]){
flag=0;
break;
}
if(flag)cout<<"负环";
else cout<<dis[n];

 


专门处理负环的板子:

bool bellman_ford(int s){
bool update=false;
For(i,1,n-1)
For(j,1,m){
int u=e[j].u,v=e[j].v,w=e[j].w;
if(dis[u]!=inf&&dis[u]+w<dis[v]){
dis[v]=dis[u]+w;
update=true;
}
if(!update)return false; //如果已经更新完毕了那就可以提前跳出
}
For(j,1,m){
int u=e[j].u,v=e[j].v,w=e[j].w;
if(dia[u]!=inf&&dis[u]+w<dis[v])return true;
}
return false;
}

 

Bellman-Ford

标签:处理   int   else   需要   turn   return   amp   struct   更新   

原文地址:https://www.cnblogs.com/planche/p/9388227.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!