HDU 3062 Party
2015-10-23 11:57
281 查看
2-SAT入门题,强联通分量缩点之后,如果夫妻位于同一强联通分量,则无解。
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<stack> #include<algorithm> using namespace std; const int maxn=2005; int N,M; int A1,A2,C1,C2; vector<int>G[maxn]; vector<int>FG[maxn]; int Belong[maxn],flag[maxn]; stack<int>S; int Block; void init() { if(!S.empty()) S.pop(); for(int i=0; i<2*N; i++) G[i].clear(); for(int i=0; i<2*N; i++) FG[i].clear(); memset(Belong,0,sizeof Belong); memset(flag,0,sizeof flag); Block=0; } void Add(int A1,int A2,int C1,int C2) { int ID1=2*A1+C1; int ID2=2*A2+C2; G[ID1].push_back(ID2^1); G[ID2].push_back(ID1^1); FG[ID2^1].push_back(ID1); FG[ID1^1].push_back(ID2); } void dfs1(int now) { flag[now]=1; for(int i=0; i<G[now].size(); i++) if(!flag[G[now][i]]) dfs1(G[now][i]); S.push(now); } void dfs2(int now) { Belong[now]=Block; for(int i=0; i<FG[now].size(); i++) if(!Belong[FG[now][i]]) dfs2(FG[now][i]); } int main() { while(~scanf("%d%d",&N,&M)) { init(); for(int i=0; i<M; i++) { scanf("%d%d%d%d",&A1,&A2,&C1,&C2); Add(A1,A2,C1,C2); } for(int i=0; i<2*N; i++) if(!flag[i]) dfs1(i); while(!S.empty()) { int Top=S.top(); S.pop(); if(!Belong[Top]) { Block++; dfs2(Top); } } int ans=1; for(int i=0; i<N; i++) { if(Belong[2*i]==Belong[2*i+1]) { ans=0; break; } } if(ans==1) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- javascript跨域的方法汇总
- CountDownLatch的介绍和使用
- Django 设置cookies与获取cookies.
- 涵盖各种编程语言的深度学习库整理大全!
- [Leetcode] Remove Nth Node From End of List
- 10.23 django1.10, TEMPLATES设置
- AC自动机+dp+大数 poj1625
- C++笔试题 字符串的比较,全排列,类似 和分解的问题
- MockHttpServletRequest examples
- 有关java的double brace initialization
- ASP.NET MVC Ajax.ActionLink 简单用法
- java操作mysql进行数据备份及恢复操作
- 【Unity3D游戏开发学习笔记】(五)灵魂降临—Unity脚本的简单运用
- 阿里云学习笔记1
- 内嵌的Component调用外部的方法
- ubuntu 编译 ProjectConfig.mk报错
- STL源码剖析:第一章
- 在同一台服务器上配置多个Tomcat(转载)
- 判断是否是微信访问并获取版本号
- Winform 数据绑定