#Bellman-Ford,深搜#洛谷 3385 【模板】负环

题目

寻找一个从顶点1所能到达的负环


分析

首先要深搜判断是否从1出发可到达,然后跑一遍Bellman-Ford。


代码

#include <cstdio>
#include <cstring>
#include <cctype>
#define rr register
using namespace std;
struct node{int x,y,w,next;}e[6001]; int ls[2001],v[2001];
inline signed iut(){
    rr int ans=0,f=1; rr char c=getchar();
    while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
    while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    return ans*f;
}
inline void dfs(int x,int fa){
    if (v[x]) return; v[x]=1;
    for (rr int i=ls[x];i;i=e[i].next)
    if (e[i].y!=fa) dfs(e[i].y,x);
}
signed main(){
    for (rr int t=iut();t;--t){
        memset(ls,0,sizeof(ls));
        memset(v,0,sizeof(v));
        rr int n=iut(),k=0,dis[2001],flag=0;
        for (rr int m=iut();m;--m){
            rr int x=iut(),y=iut(),w=iut();
            e[++k]=(node){x,y,w,ls[x]},ls[x]=k;
            if (w>=0) e[++k]=(node){y,x,w,ls[y]},ls[y]=k;
        }
        memset(dis,127/3,sizeof(dis)); dfs(1,0); dis[1]=0;
        for (rr int i=1;i<n;++i)
        for (rr int j=1;j<=k;++j)
        if (dis[e[j].y]>dis[e[j].x]+e[j].w)
            dis[e[j].y]=dis[e[j].x]+e[j].w;
        for (rr int i=1;i<=k&&!flag;++i)
        if (dis[e[i].y]>dis[e[i].x]+e[i].w&&v[e[i].x]) flag=1;
        if (flag) printf("YE5\n"); else printf("N0\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值