zoukankan      html  css  js  c++  java
  • spfa判负环

    #include <cstdlib>
    #include <cctype>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <string>
    #include <iostream>
    #include <sstream>
    #include <map>
    #include <set>
    #include <queue>
    #include <stack>
    #include <fstream>
    #include <numeric>
    #include <iomanip>
    #include <bitset>
    #include <list>
    #include <stdexcept>
    #include <functional>
    #include <utility>
    #include <ctime>
    
    
    #define PB push_back
    #define MP make_pair
    #define FOR1(n) for(int i=0;i<(n);++i)
    #define FOR2(l,h) for(int i=(l);i<=(h);++i)
    #define FOR3(h,l) for(int i=(h);i>=(l);--i)
    
    using namespace std;
    typedef vector<int> VI;
    typedef vector<string> VS;
    typedef vector<double> VD;
    typedef long long LL;
    typedef pair<int,int> PII;
    
    #define PI acos((double)-1)
    #define E exp(double(1))
    #define K 1000000+9
    int vis[K],dis[K],c[K];
    vector<pair<int,int> >mp[550];
    int spfa_bfs(int s,int n)
    {
        int ok=0;
        queue <int> q;
        memset(dis,0x3f,sizeof(dis));
        dis[s]=0;
        memset(c,0,sizeof(c));
        memset(vis,0,sizeof(vis));
        q.push(s);  vis[s]=1; c[s]=1;
        while(!q.empty())
        {
            int x=q.front();
            q.pop();
            vis[x]=0;
            for(int i=0; i<mp[x].size(); i++)
            {
                int v=mp[x][i].first;
                if(dis[v]>dis[x]+mp[x][i].second)
                {
                    dis[v]=dis[x]+mp[x][i].second;
                    if(vis[v]==1)continue;
                    c[v]++;
                    q.push(v);
                    vis[v]=1;
                    if(c[v]>n)
                        return 1;
                }
            }
        }
        return 0;
    }
    int main(void)
    {
        int t;
        cin>>t;
        while(t--)
        {
            int n,m,q,u,v,w,flag=0;
            cin>>n>>m>>q;
            memset(mp,0,sizeof(mp));
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&u,&v,&w);
                mp[u].push_back(make_pair(v,w));
                mp[v].push_back(make_pair(u,w));
            }
            for(int i=1;i<=q;i++)
            {
                scanf("%d%d%d",&u,&v,&w);
                mp[u].push_back(make_pair(v,-w));
            }
            if(spfa_bfs(1,n))
                    flag=1;
            if(flag)
               printf("YES
    ");
            else
                printf("NO
    ");
        }
    
        return 0;
    }
    int vis[K],dis[K],c[K],flag;
    vector<pair<int,int> >mp[550];
    
    void spfa_bfs(int s,int n)
    {
        dis[s]=0;
        queue<int>q;
        q.push(s);
        vis[s]=1;
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int i=0; i<mp[u].size(); i++)
            {
                int v=mp[u][i].first;
                if(dis[v]>dis[u]+mp[u][i].second )
                {
                    dis[v]=dis[u]+mp[u][i].second;
                    if(vis[v])continue;
                    if(++c[v]>n)
                    {
                        flag=1;
                        return ;
                    }
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    
    void dfs(int u)
    {
        vis[u]=1;
        for(int i=0;i<mp[u].size();i++)
        {
            int v=mp[u][i].first;
            if(dis[v]>dis[u]+mp[u][i].second)
            {
                dis[v]=dis[u]+mp[u][i].second;
                if(vis[v])
                {
                    flag=1;return ;
                }
                dfs(v);
            }
        }
        vis[u]=0;
    }
  • 相关阅读:
    底部导航栏
    判断手机是否连接网络
    瀑布流(圆角,卡片效果)
    列表卡片效果
    使用Glide改变图片的圆角
    条形码EAN-13码和EAN-8码的原理
    自定义底部弹窗
    【代码笔记】Java常识性基础补充(一)——赋值运算符、逻辑运算符、三元运算符、Scanner类、键盘输入、Random类、随机数
    【Android】9.0活动的生命周期(二)——实际代码演示
    【Android】8.0活动的生命周期(一)——理论知识、活动的启动方式
  • 原文地址:https://www.cnblogs.com/weeping/p/5673941.html
Copyright © 2011-2022 走看看