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; }
作者:weeping
出处:www.cnblogs.com/weeping/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。