• spfa判断负环


    spfa判断负环

    spfa+bfs

    #include<iostream>
    #include<cstdio>
    #include<queue> 
    #include<cstring>
    using namespace std;
    const int maxn=200010;
    const int inf=0x7fffffff;
    int t,n,m,tot,d[maxn],dis[maxn],head[maxn];
    bool flag[maxn];
    queue<int> q;
    struct node
    {
        int to;
        int w;
        int next;
    }e[maxn*2];
    void prepare()
    {
        memset(head,0,sizeof(head));
        memset(flag,0,sizeof(flag));
        memset(dis,127/3,sizeof(dis));
        memset(d,0,sizeof(d));
        tot=0;dis[1]=0;
    }
    void add_edge(int u,int v,int w)
    {
        e[++tot].to=v;
        e[tot].w=w;
        e[tot].next=head[u];
        head[u]=tot;
    }
    bool spfa()
    {
        q.push(1);flag[1]=1;d[1]=1;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();flag[u]=0;
            for(int i=head[u];i;i=e[i].next)
            {
                int v=e[i].to;
                if(dis[v]>dis[u]+e[i].w)
                {
                    dis[v]=dis[u]+e[i].w;
                    d[v]++;
                    if(d[v]>=n) return 1;
                    if(!flag[v])
                    {
                        flag[v]=1;
                        q.push(v);
                    }
                }
            }
        }
        return 0;
    }
    int main()
    {
        int x,y,z;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            prepare();
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&x,&y,&z);
                add_edge(x,y,z);
                if(z>=0) add_edge(y,x,z);
            }
            if(spfa()) printf("YE5
    ");
            else printf("N0
    ");
        }
        return 0;
    }

    时间较长,容易超时。
    spfa+dfs

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=400010;
    int t,n,m,tot,head[maxn],dis[maxn];
    bool can,flag[maxn];
    struct node
    {
        int to;
        int w;
        int next;
    }e[maxn];
    void prepare()
    {
        memset(flag,0,sizeof(flag));
        memset(dis,0,sizeof(dis));
        memset(head,0,sizeof(head));
        tot=0;can=0;
    }
    void add_edge(int u,int v,int w)
    {
        e[++tot].to=v;
        e[tot].w=w;
        e[tot].next=head[u];
        head[u]=tot;
    }
    void spfa(int u)
    {
        flag[u]=1;
        for(int i=head[u];i;i=e[i].next)
        {
            int v=e[i].to;
            if(dis[v]>dis[u]+e[i].w)
            {
                if(flag[v]||can)
                {can=1;break;}
                dis[v]=dis[u]+e[i].w;
                spfa(v);
            }
        }
        flag[u]=0;
    }
    int main()
    {
        int x,y,z;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            prepare();
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&x,&y,&z);
                add_edge(x,y,z);
                if(z>=0) add_edge(y,x,z);
            }
            for(int i=1;i<=n;i++)
            {spfa(i);if(can)break;}
            if(can) printf("YE5
    ");
            else printf("N0
    ");
        }
        return 0;
    }

    速度快。
    注意事项:
    两种写法大体相同,dis数组的初始值不同,需要注意。

  • 相关阅读:
    怎么获取pm2.5数据----pm2.5 的获取 java 通过url获取后,得到json 格式,在解析json
    MVC介绍
    如何通过URL获取天气PM2.5的数据,返回json
    23种设计模式
    xxx系统的6大质量属性战术
    作业04.提升系统性能
    淘宝网的质量属性分析
    架构漫谈读后感
    软件架构师工作流程----装修与软件的联系
    软件构架实践阅读笔记五(读后感)
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070873.html
Copyright © 2020-2023  润新知