Description
Input
Output
Sample Input
Sample Output
#include<map> #include<set> #include<stack> #include<queue> #include<cmath> #include<vector> #include<cstdio> #include<string> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define inf 0x0f0f0f0f using namespace std; struct SCC { static const int maxn=2000+10; vector<int>group[maxn],scc[maxn]; int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt,n,m; stack<int>S; void init() { for (int i=0;i<=n;i++) group[i].clear(); } void addedge(int from,int to) { group[from].push_back(to); } void dfs(int u) { pre[u]=lowlink[u]=++dfs_clock; S.push(u); for (int i=0;i<group[u].size();i++) { int v=group[u][i]; if (!pre[v]) { dfs(v); lowlink[u]=min(lowlink[u],lowlink[v]); } else if (!sccno[v]) { lowlink[u]=min(lowlink[u],pre[v]); } } if (lowlink[u]==pre[u]) { scc_cnt++; scc[scc_cnt].clear(); while (1) { int x=S.top(); S.pop(); scc[scc_cnt].push_back(x); sccno[x]=scc_cnt; if (x==u) break; } } } void find_scc() { dfs_clock=scc_cnt=0; memset(pre,0,sizeof(pre)); memset(sccno,0,sizeof(sccno)); for (int i=1;i<=n;i++) if (!pre[i]) dfs(i); } }; SCC people; int main() { int N,M,x,y,x1,y1; while(scanf("%d",&N)!=EOF) { people.n=2*N; people.init(); scanf("%d",&M); for (int i=1;i<=M;i++) { scanf("%d%d%d%d",&x,&y,&x1,&y1); people.addedge(x*2+x1,(y*2+y1)^1); people.addedge(y*2+y1,(x*2+x1)^1); } people.find_scc(); bool flag=true; for (int i=0;i<2*N;i+=2) { if (people.sccno[i]==people.sccno[i+1]) { flag=false; break; } } if (flag) printf("YES\n"); else printf("NO\n"); } return 0; }
作者 chensunrise
原文:http://www.cnblogs.com/chensunrise/p/3776474.html