这个题目的写法有很多,用二分图染色也可以写,思路很好想,这里我们用关于并查集的两种写法来做。

题目大意:输入x,y表示x和y交配,然后判断是否有同性恋。

1 带权并查集:

  我们可以用边的权值来表示一种关系,比如说

我们可以设权值为1,假如A和B发生关系,B和C发生关系,那么C到A的距离就是2,如果A和C发生关系,那就会产生矛盾,因此A和C是同性。

所以如果x和y可以发生关系,首先x和y必须在一棵树上,并且x和y到跟的距离必须同为奇数或者同为偶数。

code:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=+;
int fa[N],w[N];
int find(int x){
if(x==fa[x]) return x;
else {
int c=find(fa[x]);
w[fa[x]]%=;
w[x]=(w[x]+w[fa[x]])%;
return fa[x]=c;
}
}
bool unite(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy){
fa[fx]=fy;
w[fx]=(w[y]-w[x]+)%;
return ;
}
else {
return w[x]%==w[y]%;
}
}
void solve(int time){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
fa[i]=i;
w[i]=;
}
int ans=;
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
if(ans) continue ;
if(unite(x,y)){
ans++;
// break;//注意这里不能直接break...wa了好几发,但是CF是可以的。。。
}
}
printf("Scenario #%d:\n",time);
if(ans) puts("Suspicious bugs found!\n");
else puts("No suspicious bugs found!\n");
}
int main(){
int t;cin>>t;
for(int i=;i<=t;i++) solve(i);
return ;
}

2 种类并查集:

  如果用种类并查集来写,那这个题就相当于 食物链 那道题目的缩水版。。。

  将每个元素分为两类,x和x+n,如果x和y可以发生关系,那么x和y不能是同类,也就是说x和y不能是一类,x+n和y+n不能是一类。

  code:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=+;
int fa[N+N];
int find(int x){
return fa[x]==x? x:fa[x]=find(fa[x]);
}
int unite(int x,int y){
int fx=find(x),fy=find(y);
fa[fx]=fy;
}
bool same(int x,int y){
return find(x)==find(y);
}
void solve(int time){
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<=n+n;i++) fa[i]=i;
int ans=;
for(int i=;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
x--;y--;
if(ans) continue ;
if(same(x,y)||same(x+n,y+n)){
ans=;
// if(ans) break;//注意这里不能直接break...wa了好几发,但是CF是可以的。。。
}
else {
unite(x,y+n);unite(y,x+n);
}
}
printf("Scenario #%d:\n",time);
if(ans) puts("Suspicious bugs found!\n");
else puts("No suspicious bugs found!\n");
}
int main(){
int t;cin>>t;
for(int i=;i<=t;i++) solve(i);
return ;
}

最新文章

  1. ivy 配置 maven代理
  2. Emacs 配置 Python 编程环境
  3. (转载)linux下tar.gz、tar、bz2、zip等解压缩、压缩命令小结
  4. Hibernate学习之缓存机制
  5. OCP读书笔记(9) - 诊断数据库
  6. 大数问题:打印从1到最大的n位数
  7. Opencv如何捕获摄像头视频-OpenCV步步精深
  8. 远程通信(RPC,Webservice,RMI,JMS、EJB、JNDI的区别)对比
  9. GBDT原理及利用GBDT构造新的特征-Python实现
  10. 网络结构---从alexnet 到resnet
  11. 游戏全区全服和分区分服 QQ斗地主的设计
  12. python 的基础 学习 第八天数据类型的补充 ,集合和深浅copy
  13. 2018-2019-1 20189206 《Linux内核原理与分析》第九周作业
  14. 经典算法分析:n^2与nlgn
  15. pages bookmarks for machine learning domain
  16. Java虚拟机(JVM)概述
  17. DB2错误码
  18. mvc和mvvm的区别?
  19. awk十三问-【AWK学习之旅】
  20. 【UVA】10391 Compound Words(STL map)

热门文章

  1. NBL小可爱纪念赛「 第一弹 」 游记(部分题解)
  2. OpenCV-Python Meanshift和Camshift | 四十七
  3. 记录一次MAC连接投影闪屏的问题。
  4. Springboot + Freemarker(一)
  5. 曹工说Redis源码(1)-- redis debug环境搭建,使用clion,达到和调试java一样的效果
  6. 三、【Docker笔记】Docker镜像
  7. CSS样式的4种写法 | 以及选择器的几种用法
  8. 读者来信 | 设置HBase TTL必须先disable表吗?(已解决)
  9. 【纯净镜像】原版Windows7集成USB3.0+NVME补丁+UEFI引导旗舰版下载
  10. 001_Chrome 76支持原生HTML 图片懒加载Lazy loading