HDU1814(Peaceful Commission) 【2-SAT DFS暴力求最小字典序的模板】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814
题意:给出一个数n,代表有n个党派,每个党派要求派出其中一个人去参加会议,且只能派出一人。给出m,m行每行给出a, b.代表处于不同党派中的a, b也具有矛盾关系,a, b其中也只能有一位去参加会议。这2 * n个人的编号为1 ~ 2 * n,其中 2 * i 与 2 * i - 1是属于同一个党派。要求找到一个编号字典序最小的方案。
思路:
1.每个集合中只有2个元素,并且给出部分元素之间的限制关系,典型的2-sat问题。
2.找到对立点,建‘矛盾边’,用tarjan缩点,再判断对立点是否处在一个强连通分量中,若处在则无解,若都不处在就有解。这种思路在这道题是不可行的,因为题目要求最小字典序输出。
3.由于要保证最小字典序,我们可以用染色法来求解。每个人的编号我们默认 -1 ,这样就可以运用 ^1 运算来处理同一帮派中的2个人。从0号开始遍历到2 * n - 1号人,这样寻找方案就是最小字典序。
4.扩展:若同一对点的编号是不连续的,例如0-5,1-9,3-4. 那么我们就要用结构体排序(结构体中2个变量分别代表同一帮派中的2个人的编号),将同一点对中小的那个点按照从小到大的顺序排序,保证遍历的时候的字典序。(加矛盾边不需要处理)
代码里的注释很详细。
#include<stdio.h>
#include<string.h>
#define mem(a, b) memset(a, b, sizeof(a)) int n, m;
int head[], cnt;
int vis[], sum, node[]; struct Edge
{
int to, next;
}edge[ * ]; void add(int a, int b)
{
edge[++ cnt].to = b;
edge[cnt].next = head[a];
head[a] = cnt;
} void init()
{
mem(head, -), cnt = ;
mem(vis, );
} int dfs(int now)
{
if(vis[now ^ ])//若帮派中另一个人已经被选择,则自己一定不会被选择,返回0
return ;
if(vis[now])//若自己已经被选择,则不用再dfs了,已经找过从自己出发的方案
return ;
node[sum ++] = now;//记录查找过程中的点是哪些
vis[now] = ;
for(int i = head[now]; i != -; i = edge[i].next)//不同帮派中的矛盾关系
{
int to = edge[i].to;
if(!dfs(to))//这些边代表'必须', 不能选b,就必须选择b ^ 1,若b ^ 1找不到合理方案,说明就不存在方案了,返回0
return ;
}
return ;
} int two_sat() //返回是否存在方案
{
for(int i = ; i < * n; i += ) //由小到大遍历, 保证在有合理的方案的情况下的字典序
{
if(!vis[i] && !vis[i ^ ]) //若遍历到有帮派中2人都未被标记, 则确定之前的标记,代表是合法方案的一部分, sum清为0
{
sum = ;
if(!dfs(i))//暴力寻找的过程中发现不存在,那么该过程中被标记的点都重新处理为未被标记
{
while(sum)
vis[node[-- sum]] = ;
if(!dfs(i ^ ))//若帮派中另一个人也找不到合理方案,那么就不存在方案了,直接retrun 0
return ;
}
}
}
return ;
} int main()
{
while(scanf("%d%d", &n, &m)!=EOF)
{
init();
for(int i = ; i <= m; i ++)
{
int a, b;
scanf("%d%d", &a, &b);
a --, b --; //形成 ^1 运算关系
add(a, b ^ ), add(b, a ^ );
}
if(two_sat())
{
for(int i = ; i < * n; i += )
{
if(vis[i])
printf("%d\n", i + );
else
printf("%d\n", (i ^ ) + );
}
}
else
printf("NIE\n");
}
return ;
}
HDU1814(Peaceful Commission) 【2-SAT DFS暴力求最小字典序的模板】的更多相关文章
- Codeforces 959 树构造 暴力求最小字典序互质序列
A B C 题目给你一个结论 最少需要min((odd,even)个结点可以把一棵树的全部边连起来 要求你输出两颗树 一棵树结论是正确的 另外一棵结论是正确的 正确结论的树很好造 主要是错误的树 题目 ...
- hdu1814 Peaceful Commission
hdu1814 Peaceful Commission 题意:2-sat裸题,打印字典序最小的 我写了三个 染色做法,正解 scc做法,不管字典序 scc做法,错误的字典序贪心 #include &l ...
- HDU1814 Peaceful Commission 2-sat
原文链接http://www.cnblogs.com/zhouzhendong/p/8099115.html 题目传送门 - HDU1814 题面 Description 根据宪法,Byteland民 ...
- HDU-1814 Peaceful Commission 2sat
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1814 简单的2sat题. //STATUS:C++_AC_390MS_996KB #include & ...
- hdu1814 Peaceful Commission,2-sat
题目大意:一国有n个党派.每一个党派在议会中都有2个代表,现要组建和平委员会,要从每一个党派在议会的代表中选出1人,一共n人组成和平委员会.已知有一些代表之间存在仇恨,也就是说他们不能同一时候被选为和 ...
- hdu1814 Peaceful Commission——2-SAT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1814 第一次的2-SAT,推荐博客:https://blog.csdn.net/jarjingx/arti ...
- poj 3009 冰球 【DFS】求最小步数
题目链接:https://vjudge.net/problem/POJ-3009 转载于:https://www.cnblogs.com/Ash-ly/p/5728439.html 题目大意: 要求把 ...
- poj1509(环形字符串求最小字典序)
题意:给你一串字符串,但是这串字符串是环形的,让你找个位置切开,使得它的字典序最小....... 思路:典型的最小表示法....... #include<iostream> #includ ...
- BZOJ4974(给Next求最小字典序原串)
输入给出了最小循环节长度,暗示next数组. 然后自己按照自己的kmp板子逆着来一遍就好. ; int n, a, Next[maxn]; char str[maxn]; ]; int main() ...
随机推荐
- PHP mysqli_fetch_object() 函数
定义和用法 mysqli_fetch_object() 函数从结果集中取得当前行,并作为对象返回. 注释:该函数返回的字段名是区分大小写的. <?php // 假定数据库用户名:root,密码: ...
- 洛谷 P5174 圆点
题面 感觉被侮辱智商了,这水题NM省选NOI-.... 直接枚举一维,另一维单调不增,然后直接算答案就可以了.... gan #include<bits/stdc++.h> #define ...
- 物联网是前端工程师的新蓝海吗? | Live笔记
物联网是继 Web .无线之后的又一次重大技术变革,在变革的大潮中,程序员的知识体系和思维方式将面临全面更新. 前端开发的历史 在准备这个live的过程中,我回顾了前端开发短暂的历史,有几次我认为非常 ...
- 【java设计模式】-07适配器模式
适配器模式 定义: 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 类型: 结构型模式 应用实例: 1.JAVA JDK 1.1 提供 ...
- leetcode题目234.回文链表(快慢指针+辅助空间-简单)
题目描述: 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 进阶: 你能否用 O( ...
- Amdahl定律和可伸缩性
性能的思考 提升性能意味着可以用更少的资源做更多的事情.但是提升性能会带来额外的复杂度,这会增加线程的安全性和活跃性上的风险. 我们渴望提升性能,但是还是要以安全为首要的.首先要保证程序能够安全正常的 ...
- 微服务RESTful 接口设计规范
1.RESTful发展背景及简介 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......).因此,必须有一种统一的机制,方便不同的前 ...
- 解决:安装jenkins时web界面出现jenkins实例似乎已离线问题
https://blog.51cto.com/8593714/2318144?tdsourcetag=s_pctim_aiomsg Windows下环境也可以解决:
- kafka配置的问题排查
问题反馈: xx现场测试环境下,整个平台的数据,除了原始数据模块,其他模块正常运行.相同版本的包,在线上环境上原始数据的订阅是正常的,但是测试环境没有,查看所有相关的日志,均没有报异常,且日志中有正常 ...
- pi币--π币--手机离线式挖矿软件--pi中文教程!
Pi Network派型网络,国外热度很高手机移动式挖矿软件 一个新出的手机移动式挖矿软件,在国外热度很高,国内玩的人目前很少.项目团队成员均来自斯坦福大学,三个创始人斯坦福博士教授,现在处于挖矿第一 ...