zoukankan      html  css  js  c++  java
  • Acwing 852. spfa判断负环

    地址:https://www.acwing.com/problem/content/854/

    解析:

    引入cnt[i]数组,表示到达当前这个点最短路的边数。

    对于一个正常的正权图而言,每个点最多被更新n-1次,只会有n-1条边。

    如果到达某个点,最短路边数>=n,那么,说明有重复点,至少n+1个点,即,存在负权回路。

    由于SPFA原模板只针对了1号点。但是本题问的是是否存在,是有可能存在1号点到不了的负权回路。

    所以初始,把所有点加入队列即可。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #include<stack>
    using namespace std;
    const int maxn=1e5+10;
    const int inf=0x3f3f3f3f;
    int h[maxn],e[maxn],ne[maxn],idx,w[maxn];
    int dis[maxn],vis[maxn],cnt[maxn];
    int n,m;
    void init()
    {
        memset(h,-1,sizeof(h));
        memset(dis,inf,sizeof(dis));//可以不要
        dis[1]=0;
    }
    void add(int a,int b,int c)
    {
        w[idx]=c;
        e[idx]=b;
        ne[idx]=h[a];
        h[a]=idx++;
    }
    int spfa()
    {
        queue<int>q;
        for(int i=1;i<=n;i++)
        {
            vis[i]=1;
            q.push(i);
        }
        while(!q.empty())
        {
            int t=q.front();
            q.pop();
            vis[t]=0;
            for(int i=h[t];i!=-1;i=ne[i])
            {
                int j=e[i];
                if(dis[j]>dis[t]+w[i])
                {
                dis[j]=dis[t]+w[i];
                cnt[j]=cnt[t]+1;
                if(cnt[j]>=n)
                    return true;
                    if(!vis[j])
                    {
                        
                        q.push(j);
                        vis[j]=1;
                    }
                }
            }
        }
        return false;
    }
    int main()
    {
        init();
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            add(a,b,c);
        }
        if(spfa())
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
  • 相关阅读:
    移动端 细节点
    基于新版 node 的 vue 脚手架搭建
    全屏展示
    Vue 小实例
    移动端 模拟键盘 盖住表单
    decodeURI decodeURIComponent
    简单时钟
    全选 反选 传统写法
    星级点评 面向过程的传统写法
    JQ字符串截取
  • 原文地址:https://www.cnblogs.com/liyexin/p/14032486.html
Copyright © 2011-2022 走看看