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;
    }
  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/weeping/p/5673941.html
Copyright © 2011-2022 走看看