题目描述
这是一道模板题。
维护一个 n 点的无向图,支持:
加入一条连接 u 和 v 的无向边
查询 u 和 v 的连通性
由于本题数据较大,因此输出的时候采用特殊的输出方式:用 00 或 11 代表每个询问的答案,将每个询问的答案依次从左到右排列,把得到的串视为一个二进制数,输出这个二进制数 mod 998244353mod 998244353 的值。
请务必使用快读。
输入格式
第一行包含两个整数n,m,表示点的个数和操作的数目。
接下来 m 行每行包括三个整数 op,u,v。
如果 op=0,则表示加入一条连接 u 和 v 的无向边;
如果 op=1,则表示查询 u 和 v 的连通性。
输出格式
一行包括一个整数表示答案。
思路:并查集模板(要用快读)
#include<bits/stdc++.h>
using namespace std;
const int maxn=4000000+50;
int fa[maxn],n,m;
long long ans;
int getfa(int u){
if(fa[u]==u)return u;
return fa[u]=getfa(fa[u]);
}
void unite(int x,int y){
fa[getfa(x)]=fa[getfa(y)];
}
int rd()
{
char c_ = getchar();int x = 0,s = 1;
while(c_ < '0' || c_ > '9') {if(c_ == '-') s = -1;c_ = getchar();}//是符号
while(c_ >= '0' && c_ <= '9') {x = x*10 + c_ -'0';c_ = getchar();}//是数字
return x*s;
}
int main(){
n=rd();m=rd();
int a,b,c;
for(int i=0;i<=n;i++)fa[i]=i;
while(m--){
a=rd();b=rd();c=rd();
if(a){
ans<<=1;
ans%=998244353;
if(getfa(b)==getfa(c)){
ans++;
}
}
else{
fa[getfa(b)]=getfa(c);
}
}
cout<<ans;
return 0;
}