6.3--负权边 Bellman-Ford

#include<stdio.h>
int main()
{
    freopen("data.in","r",stdin);
    int dis[10],i,k,n,m,u[10],v[10],w[10];
    int inf=999999;
    scanf("%d%d",&n,&m);
    //读入边
    for(i=1;i<=m;i++)
        scanf("%d%d%d",&u[i],&v[i],&w[i]);
    //初始化 
    for(i=1;i<=n;i++)
        dis[i]=inf;
    dis[1]=0;
    //Bellman-Ford算法核心语句
    for(k=1;k<=n-1;k++)
        for(i=1;i<=m;i++)
            if(dis[v[i]]>dis[u[i]]+w[i])
                dis[v[i]]=dis[u[i]]+w[i];
     for(i=1;i<=n;i++)
        printf("%d ",dis[i]);
    return 0;   
}

解二,优化

#include<stdio.h>
int main()
{
    freopen("data.in","r",stdin);
    int dis[10],bak[10],i,k,n,m,u[10],v[10],w[10],check,flag;
    int inf=999999;
    scanf("%d%d",&n,&m);
    //读入边
    for(i=1;i<=m;i++)
        scanf("%d%d%d",&u[i],&v[i],&w[i]);
    //初始化 
    for(i=1;i<=n;i++)
        dis[i]=inf;
    dis[1]=0;
    //Bellman-Ford算法核心语句
    for(k=1;k<=n-1;k++)
    {
        for(i=1;i<=n;i++)
            bak[i]=dis[i];
        //松弛 
        for(i=1;i<=m;i++)
            if(dis[v[i]]>dis[u[i]]+w[i])
                dis[v[i]]=dis[u[i]]+w[i];
        check=0;
        for(i=1;i<=n;i++)
            if(bak[i]!=dis[i])
                check=1;
        if(check==0)
            break; 
    }
    flag=0;
    for(i=1;i<=m;i++)
        if(dis[v[i]]>dis[u[i]]+w[i])
            flag=1;
    if(flag==1)
        printf("此图含有负权回路\n");
    else
    {
        for(i=1;i<=n;i++)
            printf("%d ",dis[i]);
    }
    return 0;   
}
    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/x15696576570/article/details/79668823
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞