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\n");
        else
            printf("NO\n");
    }

    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;
}

 

posted @ 2016-07-15 16:08  weeping  阅读(179)  评论(0编辑  收藏  举报