并查集模板
并查集模板
代码:
1.
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int fa[1000050],n,m; 7 int f(int x) 8 { 9 if(fa[x]==x) return x; 10 else fa[x]=f(fa[x]); 11 return fa[x]; 12 } 13 void unionn(int x,int y) 14 { 15 fa[f(x)]=f(y); 16 } 17 int main() 18 { 19 int x,y,b; 20 scanf("%d%d",&n,&m); 21 for(int i=1;i<=n;i++) 22 fa[i]=i; 23 for(int i=1;i<=m;i++) 24 { 25 scanf("%d%d%d",&b,&x,&y); 26 if(b==1) 27 unionn(x,y); 28 else{ 29 if(f(x)==f(y)) printf("Y\n"); 30 else printf("N\n"); 31 } 32 } 33 return 0; 34 }
2.
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 int fa[5050],n,m,p; 7 int f(int x) 8 { 9 if(fa[x]==x) return x; 10 else fa[x]=f(fa[x]); 11 return fa[x]; 12 } 13 void unionn(int x,int y) 14 { 15 fa[f(x)]=f(y); 16 } 17 int main() 18 { 19 int x,y; 20 scanf("%d%d%d",&n,&m,&p); 21 for(int i=1;i<=n;i++) 22 fa[i]=i; 23 for(int i=1;i<=m;i++) 24 { 25 scanf("%d%d",&x,&y); 26 unionn(x,y); 27 } 28 while(p--) 29 { 30 scanf("%d%d",&x,&y); 31 if(f(x)==f(y)) printf("Yes\n"); 32 else printf("No\n"); 33 } 34 return 0; 35 }
3.
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int n,m,fat[5005],i,k,tot,x,y,z; 6 struct e{ 7 int x,y,v; 8 } a[200050]; 9 int find(int x) 10 { 11 if(fat[x]==x) return x; 12 else fat[x]=find(fat[x]); 13 return fat[x]; 14 } 15 void unionn(int x,int y) 16 { 17 int fa=find(x),fb=find(y); 18 fat[fa]=fb; 19 } 20 bool cmp(const e &x,const e &y) 21 { 22 return x.v<y.v; 23 } 24 int main() 25 { 26 cin>>n>>m; 27 for(i=1;i<=m;i++) 28 a[i].v=0x7ffffff; 29 for(i=1;i<=m;i++) 30 cin>>a[i].x>>a[i].y>>a[i].v; 31 sort(a+1,a+1+m,cmp); 32 for(i=1;i<=n;i++) fat[i]=i; 33 for(i=1;i<=m;i++) 34 { 35 if(find(a[i].x)!=find(a[i].y)) 36 { 37 unionn(a[i].x,a[i].y); 38 tot+=a[i].v; 39 k++; 40 if(k==n-1) break; 41 } 42 } 43 if(k<n-1) 44 { 45 cout<<"orz"<<endl; 46 return 0; 47 } 48 cout<<tot<<endl; 49 return 0; 50 }