Bellman-ford算法

来源:互联网 发布:安装ubuntu盘符设置 编辑:程序博客网 时间:2024/06/08 13:24
//bellman算法:
思路:进行n定点数-1次的松弛化操作,每次对所有边进行松弛化,所以不必开一个edgehead数组,因为不需要搜索遍历
??适用有向图??
#include <iostream>#include<cstdio>#include<math.h>#include<queue>#include<cstring>#define inf 0x7f7f7f7fusing namespace std;struct edge{int u,v,w;}edge[10000];int dis[100000];int edgenum;int nodenum;int pre[1000000];void print_path(int n){        int nn=pre[n];        if(pre[n]!=n)        {print_path(nn);        printf("%d ",nn);}};int bellman_ford(){    int i,j;    for(i=1;i<=nodenum;i++)        dis[i]=inf;    pre[1]=1;    dis[1]=0;    for(i=1;i<=nodenum-1;i++)     for(j=1;j<=edgenum;j++)    {        if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)        {            dis[edge[j].v]=dis[edge[j].u]+edge[j].w;            pre[edge[j].v]=edge[j].u;        }    }    int flag=0;     for(j=1;j<=edgenum;j++)    {        if(dis[edge[j].v]>dis[edge[j].u]+edge[j].w)        {            flag=1;            break;        }    }    if (flag) return -1;    else return 1;};int main(){    scanf("%d %d",&nodenum,&edgenum);    int i,n;    scanf("%d",&n);    for(i=1;i<=edgenum;i++)    {        scanf("%d %d %d",&edge[i].u,&edge[i].v,&edge[i].w);    }    if(bellman_ford()>0)        {            printf("%d\n",dis[n]);            print_path(n);            printf("%d ",n);        }    return 0;}

0 0
原创粉丝点击