hdu 1829 A Bug's Life(并查集+偏移向量)
来源:互联网 发布:mysql批量更新数据 编辑:程序博客网 时间:2024/06/13 05:34
原题链接:
hdu 1829
题目大意:
T组
n个1-n编号的昆虫,m个关系
判断您是否有同性别的。
思路:
在fa[]数组上多开一个存关系的数组,在压缩路径和合并字块时调整关系。
两个调整关系的关系式穷举法,均可证明其正确性。
(自己推也挺简单的)
代码如下:
#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;const int MAXN=2000+10;int fa[MAXN],re[MAXN];bool boss;void init(int n){for(int i=1;i<=n;i++)fa[i]=i;memset(re,0,sizeof(re));boss=true;}int find(int x){if(x==fa[x])return x;int temp=find(fa[x]);re[x]=(re[x]+re[fa[x]])%2;//因为有路径压缩,所以树的深度最大为3。压缩时,需要根据儿子结点与父结点的关系、父节点和爷爷结点的关系来调整儿子结点与爷爷结点之间的关系fa[x]=temp;return temp;}void merge(int a,int b){int x=find(a);int y=find(b);if(x==y)//根结点相同{if(re[a]==re[b])//两者与根结点的关系相等则说明存在矛盾boss=false;return;}re[x]=(1+re[a]+re[b])%2;//合并两个根节点不同的字块调整两个根节点的关系,根据两个根节点的两个儿子关系以及两个儿子分别跟两个父结点的关系fa[x]=y;return;}int main(){int T;scanf("%d",&T);for(int kase=1;kase<=T;kase++){int n,m,a,b;scanf("%d%d",&n,&m);init(n);for(int i=0;i<m;i++){scanf("%d%d",&a,&b);if(boss)//发现矛盾后就不用再合并了merge(a,b);}printf("Scenario #%d:\n",kase);if(!boss)printf("Suspicious bugs found!\n\n");else printf("No suspicious bugs found!\n\n");}return 0;}
0 0
- HDU 1829 A Bug's Life 并查集 + 向量偏移
- hdu 1829 A Bug's Life(并查集+偏移向量)
- 【并查集 偏移量】HDU 1829 A Bug's Life
- HDU 1829 A Bug‘s Life 带权并查集&&带偏移量的写法
- poj 2492--A Bug's Life(并查集,向量偏移)
- POJ 2492--A Bug's Life 【并查集,向量偏移】
- 偏移向量并查集——A Bug's Life
- 并查集Hdu 1829 A Bug's Life
- HDU 1829 A Bug's Life 并查集
- hdu 1829 A Bug's Life(并查集)
- HDU 1829 A Bug's Life(并查集)
- HDU 1829 A Bug's Life(种类并查集)
- hdu 1829 A Bug's Life (基础并查集)
- HDU 1829 A Bug's Life 并查集
- hdu 1829 A Bug's Life 并查集
- HDU 1829 A Bug's Life (并查集)
- hdu 1829 A Bug's Life 并查集
- hdu 1829 A Bug's Life ( 并查集 )
- codeforces 262B Roma and Changing Signs
- BC 62 (div.2) A
- 正则表达式案例
- LeetCode_Median of Two Sorted Arrays
- AJAX异步请求——练习
- hdu 1829 A Bug's Life(并查集+偏移向量)
- U盘安装Kali 2.0 cd-rom无法挂载解决方法
- 如何给App快速搭建虚拟服务器
- BC 62 (div.2) B
- Spring MVC笔记
- tokudb学习
- Arduino与Android蓝牙通信笔记
- APP中使用UI交互设计动效的三个好处
- Button设置单框不显示