最短路-Bellman-Ford

来源:互联网 发布:猿课软件 编辑:程序博客网 时间:2024/05/01 01:22
O(VE)

可以检测负圈

struct Edge{    int from,to;    int cost;}edge[maxn*maxn];   //有向边int n,edgenum,dis[maxn],pre[maxn]; // dis是已知最短路径长,pre是前驱bool Bellman_Ford(int original){    memset(dis,INF,sizeof(dis));    for(int i=1;i<=n;i++) pre[i]=i;    dis[original]=0;    for(int i=0;i<n;i++){// 本来写法是遍历n-1次,结尾再遍历一次看有没有负环,但是其实我这里遍历多一次,如果还不return true,也说明有负环咯,完美!        // 如果所有的边的改变不了dis了,就直接跳出,不用遍历n-1次那么多了        int flag=true;        for(int j=1;j<=edgenum;j++){            if(dis[edge[j].from]+edge[j].cost<dis[edge[j].to]){ // 松弛                dis[edge[j].to]=dis[edge[j].from]+edge[j].cost;                pre[edge[j].to]=edge[j].from;                flag=false;            }        }        if(flag)return true;    }    return false;}void print_path(int root){ // 反向输出最短路径    while(pre[root]!=root){        printf("%d->",root);        root=pre[root];    }    printf("%d\n",root);}


1 0
原创粉丝点击