一张图,初始由n个顶点,没有边,接下来对这张图进行q次操作,每次操作是以下两种之一:
加边: ! u v 表示在点u和点v之间添加一条边
查询: ? u v 查询点u和点v 是否联通
#include<bits/stdc++.h>
using namespace std;
int f[200001];
int find(int x)
{
if (f[x] != x) f[x] = find(f[x]);
return f[x];
}
int main()
{
int n, q;
cin >> n >> q;
for (int i = 1; i <= n; i++)
{
f[i] = i;
}
while (q--)
{
char ch;
int u, v;
cin >> ch >> u >> v;
if (ch == '!' && find(u) != find(v)) f[f[u]] = f[v];
else cout << (find(u) == find(v) ? "yes" : "no") << endl;
}
return 0;
}