试题请参见: https://vijos.org/p/1034
题目概述
若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚。如果x,y是亲戚,那么x的亲戚都是y的亲戚,y的亲戚也都是x的亲戚。
输入
第一行:三个整数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是否具有亲戚关系。
以下m行:每行两个数Mi,Mj,1<=Mi,Mj<=N,表示Ai和Bi具有亲戚关系。
接下来p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
输出
P行,每行一个’Yes’或’No’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。
解题思路
标准并查集.
遇到的问题
一开始写的并查集不"标准", 然后就WA了. - -|||
源代码
#include <iostream>
#include <fstream>
const int MAX_SIZE = 5001;
int set[MAX_SIZE];
int findSet(int x) {
if ( x != set[x] ) {
set[x] = findSet(set[x]);
}
return set[x];
}
void unionSet(int x, int y) {
x = findSet(x);
y = findSet(y);
set[x] = y;
}
int main() {
using std::cin;
// std::ifstream cin;
// cin.open("input.txt");
int n = 0, m = 0, p = 0;
//Initialize
for ( int i = 0; i < MAX_SIZE; ++ i ) {
set[i] = i;
}
// Input amd processing
cin >> n >> m >> p;
int person1 = 0, person2 = 0;
for ( int i = 0; i < m; ++ i ) {
cin >> person1 >> person2;
unionSet(person1, person2);
}
// Output
for ( int i = 0; i < p; ++ i ) {
cin >> person1 >> person2;
std::cout << (findSet(person1) == findSet(person2) ? "Yes" : "No") << std::endl;
}
return 0;
}