题目大意

有n个党派,每个党派2个人,这2*n个人之间存在一些敌对关系,现在要从中选出n个人组成一个委员会,要求满足:
1.每个党派中选1个
2.委员会中不存在敌对关系

分析

题目中第i个党派的成员编号是2n-1与2n,我们将编号减去1就可以通过x^1来得到和x在相同党派的另一个人了。如果a与b敌对,那么a一定与b^1相同颜色。
用染色法来解决这个问题,设1为选中的颜色,2为不选的颜色。
这样我们从一个未被染色的节点x出发将它染为1,并通过深搜将和它颜色相同的节点y染为1,并将y ^1染为2.
如果出现矛盾则将从x节点出发的节点颜色全部清零,将x染为2看是否可行,若不可行则问题无解。

代码

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<map>
#include<algorithm>
#include<set>
#include<stack>
using namespace std;
const int MAXN=160005;
const int MAXM=200005;
int col[MAXN];//col[i]为1表示选中,为0表示不选
int now[MAXN];//保存当前轮染色过程中的节点编号
int cnt;
int n,m;
struct Edge
{int v;int next;
}edge[MAXM];
int edgecount;
int head[MAXN];
void Init()
{edgecount=0;memset(head,-1,sizeof(head));
}
void Add_edge(int u,int v)
{edge[++edgecount].v=v;edge[edgecount].next=head[u];head[u]=edgecount;
}
bool Paint(int x)//染色成功返回1否则返回0
{if(col[x]==2)return 0;if(col[x]==1)return 1;col[x]=1;col[x^1]=2;now[++cnt]=x;for(int k=head[x];k!=-1;k=edge[k].next){int v=edge[k].v;if(!Paint(v))return 0;}return 1;
}
bool Work()//如果存在可行解返回1否则返回0
{memset(col,0,sizeof(col));for(int u=0;u<n*2;u++){if(col[u])continue;cnt=0;if(!Paint(u)){for(int j=1;j<=cnt;j++){col[now[j]]=0;col[now[j]^1]=0;}if(!Paint(u^1)){return 0;}}}return 1;
}
int main()
{int a,b;while(scanf("%d%d",&n,&m)!=EOF){Init();for(int i=1;i<=m;i++){scanf("%d%d",&a,&b);a--;b--;Add_edge(a,b^1);Add_edge(b,a^1);}memset(col,0,sizeof(col));if(Work())//染色成功{for(int i=0;i<n*2;i++)if(col[i]==1)cout<<i+1<<endl;}else cout<<"NIE"<<endl;}return 0;
}

HDU 1814(染色)相关推荐

  1. HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)...

    HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...

  2. HDU 1814 Peaceful Commission(2-SAT)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1814 题意: 要建立一个和平委员会,要满足以下条件: 每个党派都在委员会中恰有1个代表, ...

  3. hdu 5285(染色法判断二分图)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5285 解题思路:很明显的是二分图的判定,用染色法即可. 不过这题有一个坑,当n<=1和m=0时要 ...

  4. hdu 1814 字典序最小的2sat(暴力深搜)

    题意:      题意就是最基础的2sat,关系只有矛盾关系,然后二选一,关键是这个题目是输出字典序最小的那组解. 思路:      输出字典序最小,用强连通那个实现不了(起码没看到有人实现),其实我 ...

  5. HDU 1814 Peaceful Commission

    2-SAT,输出字典序最小的解,白书模板. //TwoSAT输出字典序最小的解的模板 //注意:0,1是一组,1,2是一组..... #include<cstdio> #include&l ...

  6. [2-sat专练]poj 3683,hdu 1814,hdu 1824,hdu 3622,hdu 4115,hdu 4421

    文章目录 Priest John's Busiest Day code Peaceful Commission code Let's go home code Bomb Game code Elimi ...

  7. [HDU 1814] Peaceful Commission

    一.题目 点此看题 二.解法 这就是2-sat\text{2-sat}2-sat带字典序最小解的经典问题,时间复杂度O(n2)O(n^2)O(n2),还是结合代码讲更好: #include <c ...

  8. hdu 1814 Peaceful Commission 题解

    题目传送门 题目大意: 有 nnn 个团队,每个团队两个人,现在要组成一个 nnn 人的组织,要求每个团队中只能有 111 个人在组织里,给出 mmm 组憎恶关系,相互憎恶的两人不能同时在组织里,给出 ...

  9. (转)2-sat 专题

    [2-sat]专题- 2-sat是一个逻辑性很强的算法,但是其套路比较固定,所以不是很热,题目很少,但也不乏AC后让人大呼爽快的好题,下面放出两篇极品论文还有几道题目的题解以供交流-- 2-sat学习 ...

最新文章

  1. 近期活动盘点:基于雷达图像预测未来降水参赛经验分享、智慧政府讲座、金融AI思享会、数据法学研讨会(11.29-11.30)
  2. MobileNet 笔记
  3. uva 11367 (Dijkstra+DP)
  4. 215.数组中的第K个最大元素/347. 前 K 个高频元素
  5. php使用curl实现get和post请求的方法,数据传输urldecode和json
  6. python元组读取到列表_python中读入二维csv格式的表格方法详解(以元组/列表形式表示)...
  7. Ext JS 6学习文档-第8章-主题和响应式设计
  8. linux设备驱动程序之时钟管理
  9. C语言知识点思维导图
  10. *ST东方A:山重水复疑无路 强烈推荐评级
  11. android手机管理器在哪里打开,小米手机任务管理器在哪?怎么打开?
  12. 【Android】kotlin语法学习
  13. IIS的404页面乱码:鏃犳硶鏄剧ず椤甸潰锛屽洜涓哄彂鐢熷唴閮ㄦ湇鍔″櫒閿欒銆�的解决方法
  14. 告诉你怎么样选择虚拟主机
  15. php tip,jQuery tip提示插件详解
  16. oracle表空间文件离线,oracle 表空间 数据文件 笔记
  17. 矩阵求导(分母布局与分子布局),以及常用的矩阵求导公式
  18. 知道这三件事,UI设计新手就能掌握设计规范
  19. Screen, Viewport 和 Rect 浅析
  20. 【Taichi】代码框架基础、数据与计算核

热门文章

  1. 使用docker部署nginx搭建简单的idea-2019 jrebel插件激活服务器
  2. Python机器学习1-餐饮企业综合分析
  3. SqlConnection,SqlDataAdapter,SqlCommand,SqlParameter
  4. c语言中的return 0有什么用?
  5. 学在信息——一方豪杰
  6. Empire简介及安装
  7. 论责任成本管理体系的构建
  8. 有符号数和无符号数的范围
  9. html点击按钮动复制推广地址,JavaScript实现点击按钮就复制当前网址
  10. 蓝牙耳机啥牌子好?口碑好、音质好的蓝牙耳机推荐