Problem Description

有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席。在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的。有没有可能会有n 个人同时列席?

Input

n: 表示有n对夫妻被邀请 (n<= 1000)
m: 表示有m 对矛盾关系 ( m < (n - 1) * (n -1))

在接下来的m行中,每行会有4个数字,分别是 A1,A2,C1,C2
A1,A2分别表示是夫妻的编号
C1,C2 表示是妻子还是丈夫 ,0表示妻子 ,1是丈夫
夫妻编号从 0 到 n -1

Output

如果存在一种情况 则输出YES
否则输出 NO

Sample Input

2
1
0 1 1 1

Sample Output

YES

Solution

  • 经典的 2-SAT 做法。

  • 拆点,将选了一个就必须选另一个的这样一组,连上一条有向边。

  • 之后跑一遍 Tarjan 求强联通分量,若矛盾的两点在同一强连通分量中就无解。

Code

#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
const int N=2005;
int n,tot,top,num;
int first[N],nex[N*N<<1],en[N*N<<1];
int dfn[N],low[N],stack[N],f[N];
bool bz[N];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline int min(int x,int y)
{return x<y?x:y;
}
inline void insert(int x,int y)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;
}
inline void tarjan(int x)
{dfn[x]=low[x]=++tot;bz[stack[++top]=x]=true;for(int i=first[x];i;i=nex[i])if(!dfn[en[i]]){tarjan(en[i]);low[x]=min(low[x],low[en[i]]);}elseif(bz[en[i]]) low[x]=min(low[x],dfn[en[i]]);if(dfn[x]==low[x]){num++;do{f[stack[top]]=num;bz[stack[top--]]=false;}while(stack[top+1]^x);}
}
int main()
{while(~scanf("%d",&n)){int m=read();tot=num=0;memset(first,0,sizeof(first));memset(dfn,0,sizeof(dfn));while(m--){int x=read(),y=read();x=x<<1|read(),y=y<<1|read();insert(x,y^1);insert(y,x^1);}n<<=1,tot=0;for(int i=0;i<n;i++)if(!dfn[i]) tarjan(i);bool pd=true;for(int i=0;i<n;i+=2)if(f[i]==f[i^1]){pd=false;break;}puts(pd?"YES":"NO");}return 0;
}

Hdu 3062. Party相关推荐

  1. hdu 3062 基础的2sat

    题意: Party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  2. HDU 3062 Party

    2-SAT入门题,强联通分量缩点之后,如果夫妻位于同一强联通分量,则无解. #include<cstdio> #include<cstring> #include<cma ...

  3. HDU 3062 Party(2-sat题模板+tarjan )

    题目: 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的.有没有可 ...

  4. 【 HDU - 3062】Party(2-sat)

    题干: 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时出现在聚会上的.有没有可 ...

  5. hdu 3062 Party(2-sat,3级)

    Party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. [kuangbin]各种各样的题单

    [kuangbin]各种各样的题单 专题1 简单搜索 POJ 1321 POJ 2251 POJ 3278 POJ 3279 POJ 1426 POJ 3126 POJ 3087 POJ 3414 F ...

  7. (转)2-sat 专题

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

  8. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  9. HDU ACM Steps 攻略

    HDU ACM Steps 攻略- Admin 2011年10月14日 名人名言:未来是光明而美丽的,爱它吧,向它突进,为它工作,迎接它,尽可能地使它成为现实吧!--车尔尼雪夫斯基 总结了一下ACM ...

最新文章

  1. java集合类学习笔记之LinkedHashMap
  2. muduo之EPollPoller
  3. 【性能】模糊查询性能提升
  4. lintcode-514-栅栏染色
  5. JBoss AS7 JNDI和EJB 3.1命名更改
  6. 第七课 循环神经网络与自然语言处理
  7. python中表示空类型的是_python中什么表示空类型
  8. 9.29 csp-s模拟测试55 联+赛+题
  9. 微信怎么at所有人_微信怎么艾特所有人 微信艾特所有人方法
  10. [Windows]msvcr110.dll运行库缺失问题解决方案
  11. PART 1.3 风控利率那些事儿(名义利率 实际利率 还款方式 以及 计算逻辑汇总)
  12. 使用python将windows下多种文件格式转换成PDF格式
  13. transPlotR 优雅的绘制基因转录本结构
  14. 简洁但功能强大的EditPlus
  15. 5G通信技术书籍分享(持续更新)
  16. SpringBoot单元测试断言 assertions
  17. IndexedDB 实践
  18. SSCoin交易开放时间及未来价值
  19. 在win7下制作MAC启动u盘
  20. 解析Linux中的VFS文件系统机制

热门文章

  1. 正则化与L0、L1、L2范数略解
  2. CentOS下双网卡单网关路由配置
  3. shell脚本中一些特殊符号
  4. 【Leetcode】二叉树展开为列表(递归思想)
  5. [云炬创业基础笔记]第二章创业者测试3
  6. linux用户和群组的作用,linux中的用户、群组和权限
  7. SVM熟练到精通3:核函数与非线性分类
  8. Memcache参数
  9. 判断事件源的另一方法
  10. 为服务器端控件添加js.net