题目如下
![](https://i-blog.csdnimg.cn/blog_migrate/aa37322ccb25eabcaf3405cc644b8221.png)
思路
我们把每一点都设置一个祖先(初始转态让每个点的祖先为自己),连接两个点就把其中一个点A的祖先的祖先(并没有错误,就是祖先的祖先)设为另一个点B(然后往上查找祖先的时候会把A的祖先变成B的祖先),检查是否连通只要检查两个点的祖先是否是同一个即可。
代码如下
#include <cstdio>
#include <algorithm>
using namespace std;
int fa[10000000];
int find_fa(int v) {//查找祖先
if (fa[v] != v) {
fa[v] = find_fa(fa[v]);
}
return fa[v];
}
void join(int u, int v) {//添加祖先
int fa1 = find_fa(u), fa2 = find_fa(v);
if (fa1 != fa2) {
fa[fa2] = fa1;
}
}
int main() {
int n, m, i, ans = 0;
scanf("%d%d", &n, &m);
for (i = 0; i <= n; i++) {
fa[i] = i;
}
for (i = 1; i <= m; i++) {
int op, u, v;
scanf("%d%d%d", &op, &u, &v);
if (!op) {
join(u, v);
} else {
ans *= 2;
if (find_fa(u) == find_fa(v))
ans++;
ans %= 998244353;
}
}
printf("%d", ans);
}