HDU1829【种类并查集】
来源:互联网 发布:yankee 知乎 编辑:程序博客网 时间:2024/06/08 06:13
题意:
检验给出条件是否有同性恋。
思路:
条件并查集。
还是一个类似的前缀和,sum[x]是x到根这段路径上的和,根一定是坐标越小的,
那么如果说对于同类(同一个集合)的判断就sum[a]是否等于sum[b]
对于不同类的话,就是他们的关系取反。
检验给出条件是否有同性恋。
思路:
条件并查集。
还是一个类似的前缀和,sum[x]是x到根这段路径上的和,根一定是坐标越小的,
那么如果说对于同类(同一个集合)的判断就sum[a]是否等于sum[b]
对于不同类的话,就是他们的关系取反。
考虑状态压缩中,关系就是叠加。
一直wa,wa在Find以后是判断各自的关系。
#include<bits/stdc++.h>using namespace std;const int N=2e3+10;int pre[N],n,sum[N],m;bool flag;int Find(int x){ if(pre[x]==x) return x; int temp=pre[x]; pre[x]=Find(temp); sum[x]=(sum[x]+sum[temp])%2; return pre[x];}void Merge(int x,int y){ int xx=Find(x); int yy=Find(y); if(xx==yy) { if(sum[x]==sum[y]) flag=false; } else{ pre[xx]=yy; sum[xx]=(sum[y]+sum[x]+1)%2; //父子之间不是同性恋; }}int main(){ int T,cas=1; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i<=n;i++) { pre[i]=i; sum[i]=0; } flag=true; while(m--) { int x,y; scanf("%d%d",&x,&y); if(!flag) continue; Merge(x,y); } printf("Scenario #%d:\n",cas++); if(flag) puts("No suspicious bugs found!"); else puts("Suspicious bugs found!"); puts(""); } return 0;}
0 0
- HDU1829【种类并查集】
- hdu1829(种类并查集)
- A Bug's Life(hdu1829种类并查集)
- POJ1182食物链,HDU1829(种类并查集)
- hdu1829(按种类来分的并查集)
- HDU1829:A Bug's Life(种类并查集)
- HDU1829 A Bug's Life(种类并查集)
- 【种类并查集】 hdu1829 A bug's Life
- hdu1829并查集
- hdu1829 并查集
- hdu1829(并查集)
- 种类为两种时,并查集的解题应用poj1703和hdu1829
- hdu1829——A Bug's Life 种类、带权并查集 裸题
- Hdu1829 并查集+广度优先搜索
- 种类并查集
- 种类并查集
- 种类并查集
- 种类并查集
- Odoo-新API的介绍与应用
- Linux系统目录结构
- sed常用用法:添加、删除
- CNTK入门新人必看【很多人不懂的基础问题】
- 设置垂直进度条
- HDU1829【种类并查集】
- Android强大的图表开源——MPAndroidChart
- 深入理解JAVA序列化(经验总结很好)
- Map Reduce for K-means Clustering(Short Introduction)
- JAXB的使用(java对象和xml文本的相互转换)
- codeVS 1214 线段覆盖
- IOS学习之block代码块
- SSM框架整合配置大全
- Java的基本数据类型