Bellman-Ford-解决负权边—C

来源:互联网 发布:java金额大写转换 编辑:程序博客网 时间:2024/06/06 07:26

Bellman-Ford算法非常简单,核心代码只有4行,并且可以完美地解决带有负权边的图,可以检测负权回路。时间复杂度为O(NM)

int main(){    int dis[50],u[50],v[50],w[50];    int inf=99999999;    int n,m,i,k,check;    scanf("%d%d",&n,&m);    for(i=1;i<=m;i++)        scanf("%d%d%d",&u[i],&v[i],&w[i]);    //初始化数组dis,顶点1到其余顶点的距离    for(i=1;i<=n;i++)        dis[i]=inf;    dis[1]=0;    //算法核心,对所有边进行n-1轮松弛   for(k=1;k<=n-1;k++)    {        check=0;//用来标记在本轮松弛中数组dis是否会发生更新        for(i=1;i<=m;i++)        {           if(dis[u[i]]+w[i]<dis[v[i]])           {               dis[v[i]]=dis[u[i]]+w[i];               check=1; //数组更新,改变check的值           }           }        if(check==0)            break; //如果数组dis没有更新,提前退出循环结束算法    }    //输出结果    for(i=1;i<=n;i++)        printf("%d ",dis[i]);    return 0;}
原创粉丝点击