[POI2001] 和平委员会 Peaceful Commission——2-sat(dfs构造字典序最小解)
题面
HDU1814
解析
2-sat裸题, 求字典序最小的解
我一开始试图用拓扑序求字典序最小的解,YY了一阵,打完代码,无论如何都要WA,于是弃疗了,至今不知为什么会错,也许是我太菜了吧,于是学习了一下dfs构造字典序最小解的方法,时间复杂度是O(nm)的
基本思路同拓扑序构造可行解一样,用染色法。但dfs是直接在原图中跑的,因此要传递选择的标记,也就是颜色。从小到大对每一个没有染色的点$j$尝试染上选择的颜色,在对称点$j'$(点$j$的编号小于点$j'$的编号)上染上不选的颜色,传递选择颜色时如果没有遇到不选的颜色,说明染色方案成功,否则失败,再给点$j'$染上选择的颜色 ,点$j$染上不选的颜色,进行相同操作,如果仍然失败,则说明该情况没有可行解。
HDU上有一个坑点:多组数据。(我的英语菜得不谈,这个东西搞了我半个小时)
代码:
#include<cstdio> #include<vector> using namespace std; const int maxn = 8006;int n, m, stak[maxn], top, col[maxn<<1]; vector<int> G[maxn<<1];int mir(int x) {return x&1? x+1: x-1; }bool paint(int x) {if(col[x])return col[x] == 1;col[x] = 1;col[mir(x)] = 2;stak[++top] = x;for(unsigned int i = 0; i < G[x].size(); ++i){int id = G[x][i];if(!paint(id))return 0;}return 1; }bool work() {for(int i = 1; i <= (n<<1); ++i)if(!col[i]){top = 0;if(!paint(i)){while(top) col[stak[top]] = col[mir(stak[top])] = 0, top--;if(!paint(mir(i)))return 0;}}return 1; }int main() {while(scanf("%d%d", &n, &m) != EOF){for(int i = 1; i <= m; ++i){int x, y;scanf("%d%d", &x, &y);G[x].push_back(mir(y));G[y].push_back(mir(x));}if(work()){for(int i = 1; i <= (n<<1); ++i)if(col[i] == 1)printf("%d\n", i);}elseprintf("NIE\n");for(int i = 1; i <= (n<<1); ++i)G[i].clear(), col[i] = 0;}return 0; }
View Code
转载于:https://www.cnblogs.com/Joker-Yza/p/11312672.html
[POI2001] 和平委员会 Peaceful Commission——2-sat(dfs构造字典序最小解)相关推荐
- cogs 313. [POI2001] 和平委员会(2-SAT
http://cogs.pro:8080/cogs/problem/problem.php?pid=pyzQimjkj 题意:有n个集合,每个集合有俩元素,要从n个中各选一个放一堆,但是有的俩不能同时 ...
- 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 ...
- HDU1814和平委员会
题目大意: 有n对的人,编号从1-2*n,m对的人之间互相不喜欢,每对人中必徐选1个人加入和平委员会,求字典序最小的解 -------------------------------- 2-SAT问题 ...
- hdu1814 Peaceful Commission,2-sat
题目大意:一国有n个党派,每个党派在议会中都有2个代表,现要组建和平委员会,要从每个党派在议会的代表中选出1人,一共n人组成和平委员会.已知有一些代表之间存在仇恨,也就是说他们不能同时被选为和平委员会 ...
- HDOJ 1814 Peaceful Commission
经典2sat裸题,dfs的2sat能够方便输出字典序最小的解... Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Mem ...
- hdu1814 Peaceful Commission 2-sat
hdu1814 Peaceful Commission 链接 emm,三个链接,三个都不同 loj随便做 hdu字典序最小 bzoj求合法方案数 思路 loj是任意一组解,直接跑tarjan然后判. ...
- HDU 1814 Peaceful Commission(2-SAT)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1814 题意: 要建立一个和平委员会,要满足以下条件: 每个党派都在委员会中恰有1个代表, ...
- hdu1814 Peaceful Commission 2-SAT建图入门
题面 The Public Peace Commission should be legislated in Parliament of The Democratic Republic of Byte ...
- [HDU 1814] Peaceful Commission
一.题目 点此看题 二.解法 这就是2-sat\text{2-sat}2-sat带字典序最小解的经典问题,时间复杂度O(n2)O(n^2)O(n2),还是结合代码讲更好: #include <c ...
- hdu 1814 Peaceful Commission 题解
题目传送门 题目大意: 有 nnn 个团队,每个团队两个人,现在要组成一个 nnn 人的组织,要求每个团队中只能有 111 个人在组织里,给出 mmm 组憎恶关系,相互憎恶的两人不能同时在组织里,给出 ...
最新文章
- ubuntu 安装yum_如何在 Linux 中安装微软的 .NET Core SDK | Linux 中国
- poj 3255 Roadblocks (SPFA)
- 局部保留投影(LPP)推导
- 走进武汉,探索多媒体开发最佳实践
- LeetCode 1286. 字母组合迭代器(回溯/位运算)
- Java描述设计模式(18):享元模式
- Redis如何做内存优化?
- html上传文件是否合法,java 在前端页面上传图片文件,验证是否为合法的图片
- 对多个有规律表进行更新剔重复操作的存储过程(up8000)
- R中的 url编码 和 解码
- 又出现*_limited.sof的问题了,还有另一个奇怪的现象!
- 查找单词个数案列实现(字符串流)
- JavaWeb知识点复习(第一次)
- Django 项目部署
- 第24章 QSPI—读写串行FLASH
- 修改Office 2016安装路径的方法
- 机器学习模型评估——混淆矩阵
- 【小游戏】Flappy bird
- CentOS7下的LAMP搭建
- 【Android -- 蓝牙】打开蓝牙和设备搜索
热门文章
- java中修改对象类的数据_Java中创建对象的六个步骤 细分后(new关键字)对象头详细介绍...
- java lambda_Java 8 Lambda 表达式 ( 中 )- 外部参数
- chown: 无效的用户: hadoop-3.1.4_Ubuntu 21.04 用户主目录权限将14年来首次变更及新功能预览...
- linux复习题之阶段性考试题目
- 获取本地文件所需配置
- MyBatis sql查询字段问题
- Android 控件 之 菜单(Menu)
- java镜像_012 制作Java基础镜像
- Unity3D 调用Java,Java调用Unity3D
- [转]Hibernate不能自动建表解决办法及Hibernate不同数据库的连接及SQL方言