HDU 1814 Two_Sat
来源:互联网 发布:华侨大学怎么样知乎 编辑:程序博客网 时间:2024/05/21 08:51
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814
题意: 有(1,2),(3,4), ...(2n-1,2n),n对数,要在每对中选出一个共n个,并且满足m个约束条件,条件(a,b)表示ab不能同时被选,按字典序输出答案,无解输出NIE
分析: Two_Sat问题,假设A,A‘为一对,B,B'为一对,那么对于约束条件(A,B),在选A的时候必须选B’,选B的时候必选选A‘,加边A->B',B->A'
模板用的是大白书上的,跑出来直接是字典序,mark为true即为取当前值。
#include <iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>#include<vector>#define maxn 8005using namespace std;struct TwoSAT{ int n; vector<int> G[maxn*2]; bool mark[maxn*2]; int S[maxn*2],c; bool dfs(int x){ if(mark[x^1])return false; if(mark[x]) return true; mark[x]=true; S[c++]=x; for(int i=0;i<G[x].size();i++) if(!dfs(G[x][i]))return false; return true; } void init(int n){ this->n=n; for(int i=0;i<n*2;i++) G[i].clear(); memset(mark,0,sizeof(mark)); } void add_clause(int x,int y){ G[x].push_back(y^1); G[y].push_back(x^1); } bool solve(){ for(int i=0;i<n*2;i+=2) if(!mark[i]&&!mark[i+1]){ c=0; if(!dfs(i)){ while(c>0)mark[S[--c]]=false; if(!dfs(i+1))return false; } } return true; } void print(){ if(!solve()) printf("NIE\n"); else { for(int i=0;i<n;i++){ if(mark[i*2]) printf("%d\n",i*2+1); else printf("%d\n",i*2+2); } } }};int main(){ int n,m,x,y; while(~scanf("%d%d",&n,&m)){ TwoSAT T; T.init(n); while(m--){ scanf("%d%d",&x,&y); T.add_clause(x-1,y-1); } T.print(); } return 0;}
0 0
- HDU 1814 Two_Sat
- Two_SAT 小结
- hdu 1814
- hdu 1814
- hdu 1814 Peaceful Commission
- hdu-1814(2-SAT)
- HDU 1814 2-SAT
- HDU 1814 Peaceful Commission
- HDU 1814 Peaceful Commission
- HDU-1814-TwoSAT
- HDU 1814(染色)
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU 1114 Piggy-Bank(完全背包 DP)
- linux下为svn创建钩子,自动update
- JAVA将字符串表示的ip地址转换为long表示
- (收集/整理)linux 内核启动 解压缩
- 如何提高学习的效率,二十四条好的建议
- HDU 1814 Two_Sat
- Brainfuck——让你脑子凌乱的程序语言
- 硬件手机版专业呼介绍QQ 793255660
- 线段树+扫描线+离散化解poj1151 hdu 1542 ( Atlantis )
- Google Adwords关键词即将告别完全精确匹配
- Android彻底退出应用程序
- 有点意思
- Sql server2012远程连接
- Python标准库03 路径与文件 (os.path包, glob包)