标签:
比较水的题~ 无聊玩玩练练手速~
#include<iostream> #include<cstdio> #include<stack> #include<vector> #include<algorithm> using namespace std; const int MAXN=1005*2,MAXE=2005*2005; vector<vector<int> >v(MAXN); int ins[MAXN];int dfn[MAXN];int low[MAXN]; int times;stack<int>sta; int vis[MAXN]; int block; int scc[MAXN]; int n,m; void tarjan(int u) { dfn[u]=low[u]=times++; sta.push(u); ins[u]=1; for(int i=0;i<v[u].size();i++) { int to=v[u][i]; if(!vis[to]) { vis[to]=1; tarjan(to); low[u]=min(low[u],low[to]); } else if(ins[to]) { low[u]=min(low[u],dfn[to]); } } if(dfn[u]==low[u]) { int cur; block++; do { cur=sta.top(); sta.pop(); ins[cur]=0; scc[cur]=block; }while(cur!=u); } } bool solve() { for(int i=0;i<2*n;i++) { if(!vis[i]) { vis[i]=1; tarjan(i); } } for(int i=0;i<2*n-1;i=i+2) { if(scc[i]==scc[i+1]) return 0; } return 1; } void init() { for(int i=0;i<MAXN-1;i++) { vis[i]=ins[i]=dfn[i]=low[i]=0; v[i].clear(); } block=times=0; } int main() { while(~scanf("%d%d",&n,&m)) { init(); int a,b,c,d; for(int i=0;i<m;i++) { scanf("%d%d%d%d",&a,&b,&c,&d); v[2*a+c].push_back((2*b+d)^1); v[2*b+d].push_back((2*a+c)^1); } if(solve()) printf("YES\n"); else printf("NO\n"); } }
标签:
原文地址:http://blog.csdn.net/u011498819/article/details/44492945