P3385 【模板】负环(bellman_ford法)

43 篇文章 1 订阅

关于这道题目,首先想到的便是SPFA,这个算法的时间复杂度是O(KM),其中K是每个点平均入队次数,M是边数,然鹅,如果有负环,那末K会等于顶点数,时间复杂度为O(NM)。so,这样的时间复杂度和Bellman-Ford的时间复杂度是一样的,所以我们直接用简单的多的Bellman-Ford来做就可以了。
下面上代码:

#include <stdio.h>
inline void Bellman_Ford(int n,int m)
{
    int i,j,k,inf=0x3f3f3f3f;
    int dis[n+1],u[m+1],v[m+1],w[m+1];
    for(i=1;i<=m;i++)
        scanf("%d%d%d",&u[i],&v[i],&w[i]);
    memsset(dis,0x3f,sizeof((int)*n);
    dis[1]=0;
    for(k=1;k<n;k++)//Bellman-Ford主体  K次松弛
    {               
        int check=1;
        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;

        if(check) break; //当已经找到到每个点的最短路径后无法松弛了
    }
    for(i=1;i<=m;i++)//判断负环  按理说如果没负环的话,n次松弛早就找到最短路了
        if(dis[v[i]]>dis[u[i]]+w[i])//因为负环的存在,使得环上可以一直松弛
        {
            printf("YE5\n");
            return;
        }
    printf("N0\n");
}
int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--)
        scanf("%d%d",&n,&m),Bellman_Ford(n,m);
}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值