题目描述
规定:x 和 y 是亲戚,y 和 z 是亲戚,那么 x 和 z 也是亲戚。如果 x,y 是亲戚,那么 x 的亲戚都是 y 的亲戚,y 的亲戚也都是 x 的亲戚。
数据输入:
- 第一行:二个整数n,m,(n<=5000,m<=5000,p<=5000),分别表示有n个人,m个亲戚关系。
- 以下m行:每行两个数,表示具有亲戚关系。
- 接下来p,询问p对亲戚关系,p<=5000 。
- 以下p行:每行两个数Pi,Pj,询问Pi和Pj是否具有亲戚关系。
数据输出:
- P行,每行一个’YES’或’NO’。表示第i个询问的答案为“具有”或“不具有”亲戚关系。
输入测试用例:
10 7
2 4
5 7
1 3
8 9
1 2
5 6
2 3
3
3 4
8 10
8 9
输出结果:
YES
NO
YES
代码实现如下:
#include <iostream>
#include <vector>
using namespace std;
int n, m, p;
vector<int> f;
void init() {
f.resize(n + 1);
for (int i = 1; i <= n; i++)
f[i] = i;
}
int find(int x) {
if (x == f[x])
return x;
return f[x] = find(f[x]);
}
void join(int c1, int c2) {
if (find(c1) != find(c2))
f[find(c1)] = find(c2);
}
int main() {
cin >> n >> m;
init();
int relative1, relative2;
for (int i = 0; i < m; i++) {
cin >> relative1 >> relative2;
join(relative1, relative2);
}
cin >> p;
vector<pair<int, int>> queries;
int query1, query2;
for (int i = 0; i < p; i++) {
cin >> query1 >> query2;
queries.push_back(make_pair(query1, query2));
}
for (int i = 0; i < p; i++) {
if (find(queries[i].first) == find(queries[i].second))
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}