【洛谷1593】【模板】template负环 递归SPFA判负环

来源:互联网 发布:数据检索网站 编辑:程序博客网 时间:2024/06/07 19:30

递归SPFA判负环…丢个模板跑

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int INF=2000000000;const int SIZE=500010;int n;int head[SIZE],nxt[SIZE],tot=0;struct edge{    int t,d;}l[SIZE];void build(int f,int t,int d){    l[++tot].t=t;    l[tot].d=d;    nxt[tot]=head[f];    head[f]=tot;}int dist[SIZE]; bool use[SIZE],vis[SIZE];bool dfs(int u){    vis[u]=1;    for(int i=head[u];i;i=nxt[i])    {        int v=l[i].t;        if(dist[v]>dist[u]+l[i].d)        {            dist[v]=dist[u]+l[i].d;            if(!use[v])            {                use[v]=1;                if(dfs(v)) return true;                use[v]=0;            }            else            {                return true;                            }        }    }    return false; }bool check(){    for(int i=1;i<=n;i++)    {        if(!vis[i])        {            use[i]=1;            if(dfs(i)) return true;            use[i]=0;        }    }    return false;}void init(){    for(int i=1;i<=tot;i++)     {        nxt[i]=l[i].t=l[i].d=0;    }    for(int i=1;i<=n;i++)    {        vis[i]=use[i]=head[i]=0;        dist[i]=INF;    }    tot=0;}void scanf(int &n){    n=0;    bool flag=0;    char a=getchar();    while(a<'0'||a>'9') {if(a=='-') flag=1;a=getchar();}    while(a>='0'&&a<='9') n=(n<<3)+(n<<1)+a-'0',a=getchar();    if(flag) n=-n;}int main(){    int T;    scanf(T);    while(T--)    {        init();        int m;        scanf(n);scanf(m);        for(int i=1;i<=m;i++)        {            int a,b,c;            scanf(a);scanf(b);scanf(c);            if(c<0) build(a,b,c);            else  build(a,b,c),build(b,a,c);        }        if(check()) puts("YE5");        else puts("N0");     }    return 0;}
0 0