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

集训是辛苦的,道路是坎坷的,休息还是必须的。经过一段时间的训练,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

题意分析,队长和俩个队员其实就是 存在互不包容的情况,不能够都放假。=== 》用于判定有无解的条件
注意这道题用到了数组序号的小技巧,但还是蛮方便的有时候,可以学习下

代码

#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define LL long long
const int MAXN = 1000<<3;  /**  这里要注意 我们多建立了好多点,所以要加上 */
const int MAXM = 1e6+100;
const double PI = acos(-1.0);
const double eps = 1e-8;
inline int read(){int x=0,f=1; char ch=getchar();while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }while (ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); }return x*f;
}
/*--------------------------------------*/
struct Edge {int from,to,next;
}edge[MAXM];
int head[MAXN],top;
int low[MAXN],dfn[MAXN];
int sccno[MAXN],scc_cnt;
stack<int>S;int Instack[MAXN];
int n,m;
int dfs_clock;void init()
{memset(head,-1,sizeof(head));top=0;} void addedge(int a,int b){Edge e={a,b,head[a]};edge[top]=e;head[a]=top++;}
int B[MAXN<<3];  // 注意这里是 将两个队员当作一个人,并和队长为一组的。
void getmap()   // 核心
{int a,b,c;for(int i=0;i<n;i++){scanf("%d%d%d",&a,&b,&c);B[a]=i<<1;   B[b]=B[c]=i<<1|1;} while(m--){/*// 和1进行异或得到的是同一组的另一个人的点。
但是这种技巧只能用于序号是从0开始的,并且每一组是两个成员这个技巧常用于 用邻接表来存图的时候,对一个边,取反向边的时候。*/scanf("%d%d",&a,&b);addedge(B[a],B[b]^1); addedge(B[b],B[a]^1) ;//建议自己找一组数据 自己手算一遍,就能够明白这个原理 }
}
void tarjan(int now,int pre)
{low[now]=dfn[now]=++dfs_clock;Instack[now]=1;S.push(now);for(int i=head[now];i!=-1;i=edge[i].next){Edge e=edge[i];if(!dfn[e.to]){tarjan(e.to,now);low[now]=min(low[now],low[e.to]);}else if(Instack[e.to])low[now]=min(low[now],dfn[e.to]);}if(low[now]==dfn[now]){scc_cnt++;for(;;){int nexts=S.top();S.pop();Instack[nexts]=0;sccno[nexts]=scc_cnt;if(nexts==now) break;}}}
void find_cut(int le,int ri)
{memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(sccno,0,sizeof(sccno));memset(Instack,0,sizeof(Instack));dfs_clock=scc_cnt=0;for(int i=le;i<=ri;i++)if(!dfn[i]) tarjan(i,-1);
}
void solve()
{for(int i=0;i<n;i++){if(sccno[i<<1]==sccno[i<<1|1])//  i<<1 ===i*2  ;i<<|1 == i*2+1 ; 同一组的两个点 {puts("no"); // 如果 有那一组两个人都去了,肯定是no  return ;}} puts("yes");
}
int main()
{//freopen("in.txt","r",stdin);//freopen("out.txt","w",stdout);while(scanf("%d%d",&n,&m)!=EOF){init();getmap();find_cut(0,2*n-1);solve();}return 0;
}

Let's go home 【2-sat 经典作图】+【scc判定有无解】相关推荐

  1. 转贴一篇经典文章--条件判定覆盖和修正条件判定覆盖的差异

    1 简介 文章的目的在于通过比较发现条件判定覆盖(即Condition/Decision Coverage C/DC)和修正条件判定覆盖(Modified Condition/Decision Cov ...

  2. 数学学习与研究杂志数学学习与研究杂志社数学学习与研究编辑部2022年第6期目录

    数学学习与研究杂志数学学习与研究杂志社数学学习与研究编辑部2022年第6期目录 高教视野     适于大课堂的混合式教学方法探究--以"应用回归分析"课程为例 孙丞;刁心薇; 2- ...

  3. 【NOI2013】向量内积

    定义两个$d$维向量${A=[a_1,a_2....a_n]}$,${B=[b_1,b_2....b_n]}$的内积为其相对应维度的权值的乘积和: $${\left \langle A,B \righ ...

  4. Luogu P2341 [HAOI2006]受欢迎的牛

    这道题应该也是经典的SCC题了吧 印象中不知道在在班里上课的时候在紫书,ACM竞赛的那些书上看到多少次(有点奇怪) 首先思路很明显,就是要找出有多少个点,以它们为起点可以遍历整个图 首先考虑一种情况, ...

  5. Hdu 3478 Catch

    如果出现遍历图中的某个点都是在奇数时刻或者偶数时刻,那么小偷的藏点就是根据时间判定在某些的奇数点和偶数点了. 如果图出现奇数的环,即:有一个环由奇数个点组成,那么环中的某个点在奇数和偶数时刻都能到达( ...

  6. 2020 杭电多校5 1007、1008、1011

    1007 tree (hdu 6820) 题意: 输入 n,kn,kn,k ,给定一棵带权树,包含 nnn 个节点,要求找到一个权重和最大的子树,使得这个子树度数大于 kkk 的节点不超过 111 个 ...

  7. 《计算机是怎样跑起来的》学习笔记

    <计算机是怎样跑起来的>学习笔记 前言 1 计算机的三大原则 2 试着制造一台计算机吧 3 体验一次手工编程 4 程序像河水一样流动着 5 与算法成为好朋友的七个要点 5.1 算法中解决问 ...

  8. 量子计算(二十):量子算法简介

    文章目录 量子算法简介 一.概述 二.量子经典混合算法 量子算法简介 一.概述 量子算法是在现实的量子计算模型上运行的算法,最常用的模型是计算的量子电路模型.经典(或非量子)算法是一种有限的指令序列, ...

  9. NP=P,一种解决方案

    NP?=P 千禧难题 这里是介绍P与NP问题的. 因为笔者懒,自己搜索去吧. 前一段时间想研究一些有意义的事情,然后发现了千禧难题第一的居然是跟计算机相关的PvsNP问题,立马引起了我的兴趣. 既然跟 ...

最新文章

  1. debian10 简单的bash脚本监控apache运行状态
  2. 贾跃亭画了一个8500亿的大饼
  3. safari图片跨域
  4. easyui select ajax,easyui的combobox根据后台数据实现自动输入提示功能
  5. Raspberry Pi 的新用法:检测家中的漏水情况
  6. linux日志保存10个,Linux 124课程 10、分析存储日志
  7. 记录学习——算法时间复杂度求法
  8. Javascript中的执行环境及作用域
  9. 单个产品出库扣减库存
  10. HTC扣动板机出现射线。获得射线与VR中物体的交点并用linerender表示出来
  11. Windows10系统安装详细教程
  12. 计算机密码学论文,密码学论文写作范例论文
  13. 陌生人交友软件有哪些?陌生人社交APP排名|良心推荐
  14. 论文阅读:Factoring Statutory Reasoning as Language Understanding Challenges
  15. rsync同步脚本示例,带有exclude参数说明
  16. 前端取值的方式(ModelMap)
  17. 魅族手机安装Google Play
  18. tar.zst 文件格式解压
  19. 墨画子卿第一章第7节: “刀马旦”
  20. Ubuntu18.04系统安装并配置mosquitto

热门文章

  1. Memcached快递上手之C#
  2. (十二)命令模式详解(故事版) .
  3. 明年打算考会计证 -柯桥有没有推荐的地方-泓畅
  4. java i18n utf_struts2.0乱码 在struts.xml里面设置struts.i18n.encoding=utf-8依然出现乱码是怎么回事呀...
  5. pandas 玩转 Excel 操作总结
  6. JAVA 双亲委派机制
  7. J0ker的CISSP之路:系统架构和设计之保护机制
  8. 布隆过滤器误判怎么办为什么会_五分钟小知识:布隆过滤器原理和应用分析
  9. ZDNS .网址注册局发布2020年第二季度全球域名发展统计报告
  10. squad战术小队steam服务器搭建教程。