[WIKIOI1073]家族(并查集)
2013-05-18 10:17
288 查看
题目描述 Description
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。输入描述 Input Description
第一行:三个整数n,m,p,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系,询问p对亲戚关系。 以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。 接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。输出描述 Output Description
P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。样例输入 Sample Input
6 5 31 2
1 5
3 4
5 2
1 3
1 4
2 3
5 6
样例输出 Sample Output
YesYes
No
数据范围及提示 Data Size & Hint
n<=5000,m<=5000,p<=5000没什么好说的, 就是个裸的并查集.
#include <stdio.h> int UnionFindSets[5002]; int GetFather_UnionFindSets(int x) { if (UnionFindSets[x] == x) return x; else { UnionFindSets[x] = GetFather_UnionFindSets(UnionFindSets[x]); return UnionFindSets[x]; } } void Union_UnionFindSets(int x, int y) { int fx = GetFather_UnionFindSets(x), fy = GetFather_UnionFindSets(y); if (fy != fx) UnionFindSets[fx] = fy; } void Init_UnionFindSets(int n) { for (int i = 0, j = n + 1; i < j; ++i) UnionFindSets[i] = i; } bool Check_UnionFindSets(int x, int y) { return (GetFather_UnionFindSets(x) == GetFather_UnionFindSets(y)); } int main() { int n, m, p, x, y; scanf("%d %d %d", &n, &m, &p); Init_UnionFindSets(n); while (m--) { scanf("%d %d", &x, &y); Union_UnionFindSets(x, y); } while (p--) { scanf("%d %d", &x, &y); if (Check_UnionFindSets(x, y)) printf("Yes\n"); else printf("No\n"); } return 0; }
相关文章推荐
- wikioi-天梯-进入省队-并查集-1073:家族
- codevs1073 家族 并查集
- 并查集 之 CODE[VS] 1073 家族
- CODEVS 1073 家族 并查集模板
- Codevs 1073 家族 并查集
- wikioi1073 家族
- CODEVS 1073 家族 (并查集)
- codevs 1073 家族 并查集
- codevs 1073 家族 并查集 解题报告
- CodeVS 1073家族(并查集)
- 简单的并查集1073家族
- CODEVS1073 家族 (并查集)
- codevs 1073 家族 并查集
- 【codevs1073】家族,胡写并查集
- 1073 家族(并查集模板)
- 并查集——1073 家族
- codevs1073 家族 并查集
- P1034 家族 (并查集 I)
- CODEVS 1073 家族
- vijos1034 家族 (并查集处理集合)