POJ3259----Wormholes(SPFA判斷負環)
阿新 • • 發佈:2019-02-17
判斷給定的有向圖中是否存在負環。
利用 spfa 演算法判斷負環有兩種方法:
1) spfa 的 dfs 形式,判斷條件是存在一點在一條路徑上出現多次。
2) spfa 的 bfs 形式,判斷條件是存在一點入隊次數大於總頂點數。
DFS
#include<stdio.h> #include<algorithm> #include<iostream> #include<math.h> #include<queue> #include<vector> #include<string> #include<string.h> #include<algorithm> using namespace std; #define inf 0xffffff int n,m,w,flag; struct e{int des,val;}; int vis[520],dis[520]; vector<e>v[520]; void spfa(int k) { if(flag) return ; vis[k]=1; int len=v[k].size(); for(int i=0;i<len;i++){ int now=v[k][i].des; if(dis[now]>dis[k]+v[k][i].val){ dis[now]=dis[k]+v[k][i].val; if(vis[now]&&!flag){ printf("YES\n"); flag=1; } else{ vis[now]=1; spfa(now); } } } vis[k]=0; } void init() { memset(vis,0,sizeof(vis)); for(int i=2;i<=n;i++) dis[i]=inf; dis[1]=0; flag=0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&w); for(int i=1;i<=n;i++) v[i].clear(); int st,ed,va; e a; for(int i=0;i<m;i++){ scanf("%d%d%d",&st,&ed,&va); a.des=ed,a.val=va; v[st].push_back(a); a.des=st,a.val=va; v[ed].push_back(a); } for(int i=0;i<w;i++){ scanf("%d%d%d",&st,&ed,&va); a.des=ed,a.val=-va; v[st].push_back(a); } init(); spfa(1); if(!flag) printf("NO\n"); } }
BFS
#include<stdio.h> #include<algorithm> #include<iostream> #include<math.h> #include<queue> #include<vector> #include<string> #include<string.h> #include<algorithm> using namespace std; #define inf 0xffffff int n,m,w; struct e{int des,val;}; vector<e>v[520]; int spfa() { int vis[520],dis[520],cnt[520]; for(int i=0;i<=n;i++){ vis[i]=0,dis[i]=inf,cnt[i]=0; } dis[1]=0,vis[1]=1,cnt[1]=1; queue<int> q; q.push(1); while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; int len=v[u].size(); for(int i=0;i<len;i++) { int de=v[u][i].des; int va=v[u][i].val; if(dis[de]>dis[u]+va) { dis[de]=dis[u]+va; if(!vis[de]) { vis[de]=1; cnt[de]++; if(cnt[de]>=n) return 1; q.push(de); } } } } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&w); for(int i=1;i<=n;i++) v[i].clear(); int st,ed,va; e a; for(int i=0;i<m;i++){ scanf("%d%d%d",&st,&ed,&va); a.des=ed,a.val=va; v[st].push_back(a); a.des=st,a.val=va; v[ed].push_back(a); } for(int i=0;i<w;i++){ scanf("%d%d%d",&st,&ed,&va); a.des=ed,a.val=-va; v[st].push_back(a); } int ans=spfa(); if(ans==1) printf("YES\n"); else printf("NO\n"); } }