并查集 【入门题】
本人水平有限,题解不到为处,请多多谅解
本蒟蒻谢谢大家观看
题目:传送门
此题用并查集来解决是否是连通的问题
code:
1 #include<bits/stdc++.h> 2 #pragma GCC optimize(3) 3 const int N=4e6+10; 4 const int mod=998244353; 5 using namespace std; 6 int n,m,ans; 7 int fa[N]; 8 inline int read(){ 9 int x=0,f=1;char ch=getchar(); 10 while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} 11 while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 12 return x*f; 13 } 14 inline void write(int x) 15 { 16 if(x<0)x=-x,putchar('-'); 17 if(x>9)write(x/10); 18 putchar(x%10+'0'); 19 } 20 int find(int x){ 21 if(fa[x]==x)return x; 22 return fa[x]=find(fa[x]);//并查集的扁平化 23 } 24 int main() 25 { 26 n=read(),m=read(); 27 for(int i=0;i<n;i++){ 28 fa[i]=i; 29 } 30 for(int i=1,opt,u,v;i<=m;i++){ 31 opt=read(); 32 u=read(); 33 v=read(); 34 int fx=find(u),fy=find(v); 35 if(opt==0){//当其为0时,需要连通u,v 36 if(fx!=fy){ 37 fa[fx]=fy;//若之前不连通,则将他们连通 38 } 39 } 40 else{//当其为1时,判断是否连通 41 if(fx==fy){ 42 ans=(ans*2+1)%mod;//若为连通,则为 1 ,转换二进制 43 } 44 else{ 45 ans=(ans*2)%mod;//若不连通,则为0 ,转换二进制 46 } 47 } 48 } 49 printf("%d\n",ans); 50 return 0; 51 }