HDU3062&&HDU1814
Preface
两道2-SAT模板题。
HDU3062
看题目就一眼2-SAT。一对夫妻看成一个变量,之间的矛盾可以看成限制。
考虑不同席的限制,相当于选了\(i\)就不选\(j\),即必选\(j'\)。所以我们\(i\to j',j\to i'\)连边即可。
Tarjan判一发可行性即可。注意一下编号从\(0\)开始。
CODE
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
const int N=1005;
struct edge
{
int to,next;
}e[(N*N)<<1];
int head[N<<1],dfn[N<<1],low[N<<1],stack[N<<1],col[N<<1],n,m,cnt,tot,top,scc,x1,x2,y1,y2;
bool vis[N<<1];
inline void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void Tarjan(int now)
{
dfn[now]=low[now]=++tot; stack[++top]=now; vis[now]=1;
for (register int i=head[now];~i;i=e[i].next)
if (!dfn[e[i].to]) Tarjan(e[i].to),low[now]=min(low[now],low[e[i].to]);
else if (vis[e[i].to]) low[now]=min(low[now],dfn[e[i].to]);
if (dfn[now]==low[now])
{
col[now]=++scc; vis[now]=0;
while (now!=stack[top])
col[stack[top]]=scc,vis[stack[top--]]=0; --top;
}
}
inline void clear(void)
{
memset(head,-1,sizeof(head)); memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn)); memset(vis,0,sizeof(vis));
cnt=tot=top=scc=0;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; start:
while (scanf("%d%d",&n,&m)!=EOF)
{
for (clear(),i=1;i<=m;++i)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
add((x1<<1)+x2,(y1<<1)+(!y2)); add((y1<<1)+y2,(x1<<1)+(!x2));
}
for (i=0;i<(n<<1);++i) if (!dfn[i]) Tarjan(i);
for (i=0;i<n;++i) if (col[i<<1]==col[(i<<1)+1]) { puts("NO"); goto start; }
puts("YES");
}
}
HDU1814
题目大意:现有\(n\)个党派,每个党派需要在两个代表中选一个,这\(2n\)个代表中有彼此讨厌的\(m\)对人,输出\(n\)个去开会的代表(多解则输出字典序最小解)
又是互相厌恶,这就很好办了,直接套上一题的建图方法,然后暴力DFS,中间清空标记。
字典序最小的话就优先选择\(i'\),清空的时候不要ZZ一样的memset,开一个栈存一下递归到的点。
其他的都是板子。CODE
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
const int N=8005,M=20005;
struct edge
{
int to,next;
}e[M<<1];
int head[N<<1],stack[N<<1],n,m,x,y,top,cnt;
bool vis[N<<1];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline bool read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc())) if (ch==EOF) return 0;
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc())); return 1;
}
inline void add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
}
inline bool DFS(int now)
{
if (vis[now^1]) return 0;
if (vis[now]) return 1;
vis[now]=1; stack[top++]=now;
for (register int i=head[now];~i;i=e[i].next)
if (!DFS(e[i].to)) return 0;
return 1;
}
inline bool solve(void)
{
for (register int i=0;i<(n<<1);i+=2)
if (!vis[i]&&!vis[i^1])
{
top=0;
if (!DFS(i))
{
while (top) vis[stack[--top]]=0;
if (!DFS(i^1)) return 0;
}
}
return 1;
}
inline void print(void)
{
for (register int i=0;i<(n<<1);i+=2) printf("%d\n",vis[i]?i+1:(i^1)+1);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i;
while (read(n)&&read(m))
{
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
for (cnt=0,i=1;i<=m;++i)
{
read(x); read(y); --x; --y;
add(x,y^1); add(y,x^1);
}
if (solve()) print(); else puts("NIE");
}
return 0;
}
HDU3062&&HDU1814的更多相关文章
- 2-SAT超入门讲解
Preface 说实话2-SAT的题目我都没怎么做过,所以这里讲的都是些超入门什么的 还有一些板子题,由于是暑假的时候学的所以有些我也记不清了 主要学习参考自:Mancher的课件&& ...
- 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民 ...
- 2-SAT(HDU-3062 party)
2-SAT(HDU-3062 party) 解决问题类型: 书本定义:给一个布尔方程,判断是否存在一组解使整个方程为真,被称为布尔方程可满足性问题(SAT) 因为本题只有0,1(丈夫 妻子只能去一个人 ...
- 2-sat按照最小字典序输出可行解(hdu1814)
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 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人组成和平委员会.已知有一些代表之间存在仇恨,也就是说他们不能同一时候被选为和 ...
- hdu3062(two-sat)
传送门:Party 题意:有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在 ...
- 【POI2001】【HDU1814】和平委员会
题面 Description 根据宪法,Byteland民主共和国的公众和平委员会应该在国会中通过立法程序来创立. 不幸的是,由于某些党派代表之间的不和睦而使得这件事存在障碍. 此委员会必须满足下列条 ...
随机推荐
- OkHttp3源码详解(一) Request类
每一次网络请求都是一个Request,Request是对url,method,header,body的封装,也是对Http协议中请求行,请求头,实体内容的封装 public final class R ...
- android recovery升级过程中掉电处理
一般在升级过程,都会提示用户,请勿断电,不管是android的STB,TV还是PHONE,或者是其他的终端设备,升级过程,基本上都可以看到“正在升级,请勿断电”,然后有个进度条,显示升级的进度. 但是 ...
- 【CSS基础】实现 div 里的内容垂直水平居中
方案一: 所有内容垂直水平居中 兼容性:IE8+. 条件:内容宽度和高度可以未知,可以是多行文字.图片.div. 描述:使用table-cell + vertical-align , html代码见文 ...
- 鸟哥的 Linux 私房菜Shell Scripts篇(二)
参考: http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script_be http://www.runoob.com/lin ...
- 32_使用BeanUtils工具包操作JavaBean
由于对属性设置值和得到值的需求很多,使用频率很高,所以有一些开源勇士 不满足于JavaBean API 中IntroSpector来操作bean, 写出来了通用的BeanUtils工具,来进一步简 ...
- python之字符串的常用操作(转)
1. 字符串的操作 字符串的连接操作 符号: + 格式:str1 + str2 例如:str1 = 'I Love' str2 = 'You!' print(str1 + str2) >> ...
- 【17】有关python面向对象编程的提高【多继承、多态、类属性、动态添加与限制添加属性与方法、@property】
一.多继承 案例1:小孩继承自爸爸,妈妈.在程序入口模块再创建实例调用执行 #father模块 class Father(object): def __init__(self,money): self ...
- 团队项目管理:Github项目误删恢复记录
参考: 准备更换git托管,如何迁移原git仓库 Github项目误删恢复记录 今天正常上线打卡,发现组织的线上Github仓库被误删了..本来是一场悲剧,所幸在本地的垃圾箱中翻出了还没有删除的本地仓 ...
- ug nx7.5安装方法(图文详解)
UG7.5,也称NX7.5,自卑西门子收购,软件名字已经改为SIEMENS NX了,ug7.5是一套集成了CAD.CAE 和CAM解决方案,能为设计师们提供最功能齐全的设计环境,能够大大 ...
- 迷宫问题 dfs bfs 搜索
定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, ...