Problem Description

小时候,乡愁是一枚小小的邮票,我在这头,母亲在那头。
                        —— 余光中

集训是辛苦的,道路是坎坷的,休息还是必须的。经过一段时间的训练,lcy决定让大家回家放松一下,但是训练还是得照常进行,lcy想出了如下回家规定,每一个队(三人一队)或者队长留下或者其余两名队员同时留下;每一对队员,如果队员A留下,则队员B必须回家休息下,或者B留下,A回家。由于今年集训队人数突破往年同期最高记录,管理难度相当大,lcy也不知道自己的决定是否可行,所以这个难题就交给你了,呵呵,好处嘛~,免费**漂流一日。

Input

第一行有两个整数,T和M,1<=T<=1000表示队伍数,1<=M<=5000表示对数。
接下来有T行,每行三个整数,表示一个队的队员编号,第一个队员就是该队队长。
然后有M行,每行两个整数,表示一对队员的编号。
每个队员只属于一个队。队员编号从0开始。

Output

可行输出yes,否则输出no,以EOF为结束。

Sample Input

1 2
0 1 2
0 1
1 2

2 4
0 1 2
3 4 5
0 3
0 4
1 3
1 4

Sample Output

yes
no

思路:每个人有两种选择,根据题意要满足两种条件:

1)队长留 或 两个队员留

2)由 M 指出的一对队员 a、b 的冲突条件

假设 a、b、c 三个组成一队,a 是队长,那么由条件 1 可知 队长 a 与队员 b、c 二者只能选一种,假设留为 1 走为 0,则:

对于任一人走:

  • a 走,导致 b、c 留:<a,0,b,1>、<a,0,c,1>,添边:(a+3*n,b)、(a+3*n,c)
  • b 走,导致 a 留,c 走:<b,0,a,1>,添边:(b+3*n,a)
  • c 走,导致 a 留,b 走:<c,0,a,1>,添边:(c+3*n,a)

对于 M 个条件:

  • a 留,导致 b 走:<a,b+3*n>
  • b 留,导致 a 走:<b,a+3*n>

根据以上关系,添加关系至 2-SAT 中判断即可

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 EnewPosstr 1e-9
#define newPosI 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<=6*n;i++)//总点数if(!dfn[i])Tarjan(i);for(int i=1;i<=3*n;i++)if(scc[i]==scc[i+3*n])//遍历是不是会有一个人有2种可能return false;return true;
}
int main() {while( scanf("%d%d",&n,&m)!=EOF&&(n+m)){init();for(int i=1;i<=n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);a++,b++,c++;addEdge(a+3*n,b);//a不留b留addEdge(a+3*n,c);//a不留c留addEdge(b+3*n,a);//b不留a留addEdge(c+3*n,a);//c不留a留}while(m--) {int a,b;scanf("%d%d",&a,&b);a++,b++;addEdge(a,b+3*n);//a留b不留addEdge(b,a+3*n);//b留a不留}bool flag=twoSAT();if(!flag)printf("no\n");elseprintf("yes\n");}return 0;
}

Let's go home(HDU-1824)相关推荐

  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. javax.websocket.DeploymentException: The path [webScoketServiceBaidu/{appID}] is not valid.
  2. 深度学习之表面缺陷识别
  3. 小程序开发语言python_小程序是用什么语言开发的?5种最佳语言分享
  4. linux生产上线工具,Linux 产能工具及其使用技巧
  5. 【算法分析与设计】浅谈递归与非递归
  6. 百度优化和谷歌优化的不同点
  7. js设置百分比保留两位小数
  8. 我的是50M宽带,速度有5M/s,难道是百度网盘不给力?
  9. chattr lsattr
  10. WPF自定义开关切换按钮
  11. Deploy Oracle 10.2.0.5 on Red Hat Enterprise Linux 6.4
  12. div+css 怎么让一个小div在另一个大div里面 垂直居中
  13. 华成英模拟电子技术笔记(1)-绪
  14. 威海市第四届ACM大赛感想
  15. 面试中问到的遇到什么困难的问题,如何解决? 方法论借鉴
  16. 为什么传统的验证码不再安全
  17. 【Translate插件】报错:更新TTK失败,请检查网络连接问题
  18. VScode配置C/C++环境(适合大学生C++课程,从零开始配置)
  19. Java、Android工具整理 - 单位换算
  20. [附源码]java毕业设计零食销售系统

热门文章

  1. 一文读懂人工智能的前世今生(建议收藏)
  2. 求你了,别再随便打日志了,教你动态修改日志级别!
  3. 代码规范 设计模式落地之路
  4. JeecgBoot 单表数据导出多sheet实例
  5. JEECG_3.7.2新版本入门讲解—UI标签库专题
  6. 【jeecg Docker安装】使用 Docker 搭建 Java Web 运行环境
  7. JEECG社区第六期架构培训班报名
  8. 数据仓库组件:Hive环境搭建和基础用法
  9. Active Contour Models 主动轮廓模型
  10. MATLAB2017深度学习工具箱总结