bellman-ford的一般形式(下一站:spfa)

来源:互联网 发布:君麻吕实力 知乎 编辑:程序博客网 时间:2024/06/05 23:45

这两天都没有怎么敲题,被两题卡了整整两天,有点惭愧!好吧,会努力的,该放弃的还是要放弃的,不过有时候还是要坚持的,自信还是要有的。好的,废话就不多说了,下面就简单说说bellman-ford,主要参考了小白书,谢谢lrj大神吧!bellman主要是从边的角度来考虑的,存图的形式主要以存边为主。(说实话bellman我不怎么用,但还是觉得多一种思考方式,也不是坏事)就直接上代码:会在代码中给出部分解释:

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn=10005;const int INF=0x3f3f3f3f;int u[maxn],v[maxn],w[maxn];int dis[maxn];int bellmanF(int from ,int to,int n,int m){    memset(dis,INF,sizeof(dis));    dis[from]=0;    for(int i=0;i<n;i++){     //做n次松弛操作;        for(int k=0;k<m;k++){    //依次检查m条边;            int x=u[k],y=v[k];            if(dis[x]<INF)                dis[y]=min(dis[y],dis[x]+w[k]);  //松弛;        }    }    //for(int i=0;i<=n;i++)printf("%d : %d\n",i,dis[i]);    return dis[to];}int main(){    int n,m;    while(~scanf("%d%d",&n,&m)){            int from ,to,len;        for(int i=0;i<m;i++){            scanf("%d%d%d",&from ,&to,&len);            u[i]=from,v[i]=to;            w[i]=len;        }        scanf("%d%d",&from,&to);        bellmanF(from ,to, n,m);        printf("%d \n",dis[to]);    }    return 0;}


0 0
原创粉丝点击