博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1829 A Bug's Life(种类并查集)
阅读量:5112 次
发布时间:2019-06-13

本文共 1857 字,大约阅读时间需要 6 分钟。

思路:见代码吧。

 

#include 
#include
#include
#include
#include
using namespace std;const int maxn=2010;int n,m;int father[maxn];int num[maxn]; //num[i]表示int rel[maxn]; //rel[i]表示它与根节点的关系,0代表同性,1代表异性void init(){ for(int i=0;i<=n;i++){ father[i]=i; num[i]=1; rel[i]=0; }}//查找根节点时,同时更新它与根节点的关系。这里要注意的是:先更新玩父节点,再更新自己的。int find_root(int x){ int fa; if(father[x]==x) return x; fa=find_root(father[x]); rel[x]=(rel[x]+rel[father[x]])%2; father[x]=fa; return father[x];}void Union(int a,int b,int x,int y){ if(num[x]>num[y]){ father[y]=x; num[x]+=num[y]; //更新y与根节点x的关系 rel[y]=(rel[b]+1+rel[a])%2; //刚开始这里写错了,忘加了rel[a]。。。下面忘加了rel[b]。。。 } else{ father[x]=y; num[y]+=num[x]; //更新x与根节点y的关系 rel[x]=(rel[a]+1+rel[b])%2; }}int main(){ int t,a,b,flag; scanf("%d",&t); for(int q=1;q<=t;q++){ scanf("%d%d",&n,&m); init(); flag=0; for(int i=1;i<=m;i++){ scanf("%d%d",&a,&b); if(flag) continue; int x=find_root(a); int y=find_root(b); if(x!=y){ Union(a,b,x,y); } else{ //当a、b父节点相同时: //t表示a、b之间的关系,若关系为0,就表示它们是同性 //也可以判断两者与父节点性别的区别是相同的,即rel[a]==rel[b]那么这两个为同性 int t=(rel[b]+rel[a])%2; if(t==0){ flag=1; } } } printf("Scenario #%d:\n",q); if(flag){ printf("Suspicious bugs found!\n"); } else{ printf("No suspicious bugs found!\n"); } printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/chenxiwenruo/p/3295480.html

你可能感兴趣的文章
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>
(转)Android之发送短信的两种方式
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>
设计模式之装饰者模式
查看>>
一道不知道哪里来的容斥题
查看>>
Blender Python UV 学习
查看>>
window添加右键菜单
查看>>
入手腾龙SP AF90mm MACRO
查看>>
Window7上搭建symfony开发环境(PEAR)
查看>>
Linux内核态、用户态简介与IntelCPU特权级别--Ring0-3
查看>>