HDU 3062 Party (2-SAT)
2012-09-15 16:49
387 查看
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <queue> #include <stack> using namespace std; const int N=2009; struct LT { int to,nex; } L[N*N]; int F ,cnt; void add(int f,int t) { L[cnt].nex = F[f]; L[cnt].to = t; F[f] = cnt++; } int col ,low ,dfn ,post ,color,ind; stack<int> S; void tarjan(int k) { low[k] = dfn[k] = ++ind; S.push(k); post[k] = true; for(int i=F[k]; i; i=L[i].nex) { int to = L[i].to; if(!dfn[to]) { tarjan(to); low[k] = min(low[k],low[to]); } else if(post[to]&&dfn[to]<low[k]) low[k] = dfn[to]; } if(low[k]==dfn[k]) { int i; color++; for(i=S.top(),S.pop(); i!=k; i=S.top(),S.pop()) { post[i] =0,col[i] = color; } post[k]=0,col[k] = color; } } int main() { freopen("in.txt","r",stdin); int n,m; while(~scanf("%d%d",&n,&m)) { int a1,a2,b1,b2; cnt=1; ind = 1; memset(F,0,sizeof(F)); for(int i=0; i<m; i++) { scanf("%d%d%d%d",&a1,&a2,&b1,&b2); add(a1+n*b1,a2+(b2^1)*n); add(a2+n*b2,a1+(b1^1)*n); } memset(dfn,0,sizeof(dfn)); for(int i=0; i<n*2; i++) if(!dfn[i]) tarjan(i); bool fin = false; for(int i=0; i<n; i++) if(col[i]==col[i+n]) { fin = true; break; } if(fin) printf("NO\n"); else printf("YES\n"); } return 0; }
相关文章推荐
- HDU_3062 Party (2-SAT)
- hdu 3062 party#2-sat
- HDU 3062 Party (2-SAT入门)
- HDU 3062 Party(2-SAT)
- HDU 3062 Party 2-sat
- HDU_3062_Party(2-SAT)
- hdu 3062 Party 2-SAT
- hdu_3062_Party(2-SAT)
- 2-sat入门, hdu 3062 Party
- hdu_3062_Party(2-SAT)
- HDU 3062 Party 2 - SAT裸题
- HDU 3062 Party (2-SAT)
- HDU 3062 Party (2-SAT模板题)
- HDU 3062 Party 2-sat
- HDU 3062 Party(2-SAT模版题)
- hdu 3062 Party【2-SAT入门---强连通Tarjan+染色缩点】
- hdu 3062 Party(2-sat入门)
- HDU 3062 Party (2-SAT入门学习)
- 【HDU】3062 Party 2-sat
- 2-SAT (判断是否有解)——Party ( HDU 3062 )