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


1
0 1 1 1 

Sample Output

YES

思路:每对夫妻代表图中一个结点,只有 1、0 两种选择,对于有矛盾的夫妻对,使其不列席,让无矛盾夫妻对的列席即可

对于 m 矛盾关系,设 a、b 两对夫妇存在矛盾:

  • 若第 a 对的妻子与第 b 对的妻子有矛盾(a b 0 0)
    则 a 的妻子去了 b 的丈夫必须去,b 的妻子去了 a 的丈夫必须去:<a,0,b,1>、<b,0,a,1>,添边:<a+n,b>,<b+n,a>
  • 若第 a 对的妻子与第 b 对的丈夫有矛盾(a b 0 1)
    则 a 的妻子去了 b 的妻子必须去,b 的丈夫去了 a 的丈夫必须去:<a,0,b,0>、<b,1,a,1>,添边:<a+n,b+n>,<b,a>
  • 若第 a 对的丈夫与第 b 对的妻子有矛盾(a b 1 0)
    则 a 的丈夫去了 b 的丈夫必须去,b 的妻子去了 a 的妻子必须去:<a,1,b,1>、<b,0,a,0,>,添边:<a,b>,<b+n,a+n>
  • 若第 a 对的丈夫与第 b 对的丈夫有矛盾(a b 1 1)
    则 a 的丈夫去了 b 的妻子必须去,b 的丈夫去了 a 的妻子必须去:<a,1,b,0>、<b,1,a,0>,添边:<a,b+n>,<b,a+n>

Source Program

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#define Exp 1e-9
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
const int MOD = 1E9+7;
const int N = 1000000+5;
const int dx[] = {-1,1,0,0,-1,-1,1,1};
const int dy[] = {0,0,-1,1,-1,1,-1,1};
using namespace std;struct Edge{int to,next;
}edge[N*2];
int head[N],tot;
int n,m;
int dfn[N],low[N];
bool vis[N];//标记数组
int scc[N];//记录结点i属于哪个强连通分量
int block_cnt;//时间戳
int sig;//记录强连通分量个数
stack<int> S;
void init(){tot=0;sig=0;block_cnt=0;memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(scc,0,sizeof(scc));
}
void addEdge(int from,int to){edge[++tot].to=to;edge[tot].next=head[from];head[from]=tot;
}
void Tarjan(int x) {vis[x]=true;dfn[x]=low[x]=++block_cnt;//每找到一个新点,纪录当前节点的时间戳S.push(x);//当前结点入栈for(int i=head[x]; i!=-1; i=edge[i].next) { //遍历整个栈int y=edge[i].to;//当前结点的下一结点if(!dfn[y]) {Tarjan(y);low[x]=min(low[x],low[y]);}else if(vis[y])low[x]=min(low[x],dfn[y]);}if(dfn[x]==low[x]) { //满足强连通分量要求sig++;//记录强连通分量个数while(true) { //记录元素属于第几个强连通分量int temp=S.top();S.pop();vis[temp]=false;scc[temp]=sig;if(temp==x)break;}}
}
bool twoSAT(){for(int i=1;i<=2*n;i++)//找强连通分量if(!dfn[i])Tarjan(i);for(int i=1;i<=n;i++)if(scc[i]==scc[i+n])//条件a与!a属于同一连通分量,无解return false;return true;
}
int main() {while( scanf("%d%d",&n,&m)!=EOF&&(n+m)){init();while(m--) {int x,y,xVal,yVal;scanf("%d%d%d%d",&x,&y,&xVal,&yVal);x++;y++;if(xVal==0&&yVal==0){//x为0或y为0addEdge(x+n,y);//x为0,y为1addEdge(y+n,x);//y为0,x为1}else if(xVal==0&&yVal==1){//x为0或y为1addEdge(x+n,y+n);//x为0,y为0addEdge(y,x);//y为1,x为1}else if(xVal==1&&yVal==0){//x为1或y为0addEdge(x,y);//x为1,y为1addEdge(y+n,x+n);//y为0,x为0}else if(xVal==1&&yVal==1){//x为1或y为1addEdge(x,y+n);//x为1,y为0addEdge(y,x+n);//y为1,x为0}}bool flag=twoSAT();if(!flag)printf("NO\n");elseprintf("YES\n");}return 0;
}

Party(HDU-3062)相关推荐

  1. 有源汇有上下界最大流/最小流 配题(HDU 3157)

    因为是有源汇所以设源点为 s,汇点为 t. 有源汇有上下界最大流: 连接一条 t 指向 s 的边,容量为 INF. 通过上述步骤,现在图变成了无源汇网络. 引入超级源点 S,超级汇点 T. 连接一条 ...

  2. 最大表示法--环形字符串最大字典序(HDU 5442)

    http://acm.hdu.edu.cn/showproblem.php?pid=5442 问题概述:n个字符围成一个环,请从这个环中找出字典序最大的长度为n的字符串,输出它的起始点和方向(0顺1 ...

  3. HDU2019多校第二场 1009(HDU 6599) I Love Palindrome String(回文树(自动机)+manacher)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 解题思路: 回文自动机求每个本质不同的子串出现的次数,同时记录每个节点i代表的回文串第一次出现的 ...

  4. S-Nim (HDU 1536)组合博弈SG多组游戏

    S-Nim 题目链接 Problem Description Arthur and his sister Caroll have been playing a game called Nim for ...

  5. BestCoder25 1001.Harry and Magical Computer(hdu 5154) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5154 题目意思:有 n 门 processes(编号依次为1,2,...,n),然后给出 m 种关系: ...

  6. (HDU - 1847)Good Luck in CET-4 Everybody!(博弈)

    题目链接:Good Luck in CET-4 Everybody! - HDU 1847 - Virtual Judge (ppsucxtt.cn) 题目是中文的,我在这就不翻译题意了. 先说一种打 ...

  7. 美素数(HDU 4548)(打表,简化时间复杂度)

    相信大家都喜欢美的东西,让我们一起来看看美素数吧. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为"美素数",如29,本身是素数,而且2+9 = 11 ...

  8. 单词数(HDU 2072)

    lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Input 有多组数据,每组一行,每组就 ...

  9. Ant Trip(HDU 3018)---多笔画问题

    题目链接 题目描述 Ant Country consist of N towns.There are M roads connecting the towns. Ant Tony,together w ...

  10. 机器人的舞蹈(hdu 2232)

    机器人的舞蹈 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

最新文章

  1. MFC 使用datetimepicker获取时间
  2. vuepress侧边栏配置_VuePress搭建静态博客网站
  3. zookeeper 3.6.2启动报错:找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
  4. 软件测试——进程调度(短作业优先调度算法+先来先服务算法)测试
  5. 程序员修炼之道---读书随笔1
  6. Java BIO、NIO、AIO的区别
  7. 用python计算1~100的阶乘之和_在Python中递归函数调用举例and匿名函数lambda求1~100的和及计算阶乘举例...
  8. 大数据_Flink_数据处理_yarn和k8s平台的flink部署---Flink工作笔记0015
  9. python 关闭udp端口_UDP聊天器
  10. 数据挖掘概念与技术第三版 范明、孟晓峰译 第三章习题答案
  11. log 1用计算机怎么打开,log是什么?log怎么打开?
  12. tair ldb存储引擎性能测试方案
  13. Docker的数据管理
  14. php扩容方案,PHP程序员玩转Linux系列-腾讯云硬盘扩容挂载
  15. 第九周项目六--三色球问题
  16. 笔记本电脑wifi连接网络不能上网有感叹号
  17. Nginx的简单使用,配置多前端,多端口【微信小程序+前后端分离跨域解决】
  18. 一个基于Web服务器的PoW区块链案例
  19. 矢量数据下载【道路路网(公路、铁路)、水系、建筑物轮廓、地名等等】
  20. 带有频闪灯教程的Android Torch App

热门文章

  1. Oracle分页的SQL语句
  2. 朋友圈消失的人,都在偷偷读哪些书?
  3. STM32之串口例程
  4. 深入理解java虚拟机gc_java底层:GC相关——深入理解java虚拟机
  5. 美团面试:如何设计一个注册中心?
  6. 梁鑫:美股交易架构实践
  7. 阿里专家常昊:新人如何上手项目管理?
  8. 关于oracle分组后组外排序的问题
  9. 大数据之旅--Hadoop的发展史
  10. Redis实现消息队列之生产消费模式