模板(P3367)
#include<bits/stdc++.h>
using namespace std;
int n,m,z,x,y;
int fa[1000000];
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void join(int c1,int c2){
int f1=find(c1),f2=find(c2);
if(f1!=f2) fa[f1]=f2;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) fa[i]=i;
while(m--){
cin>>z>>x>>y;
if(z==1){
join(x,y);
}else{
if(find(x)!=find(y))
cout<<'N'<<endl;
else
cout<<'Y'<<endl;
}
}
return 0;
}
亲戚(P1151)
#include<bits/stdc++.h>
using namespace std;
int n,m,p,x,y;
int fa[100000];
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void join(int c1,int c2){
int f1=find(c1),f2=find(c2);
if(f1!=f2) fa[f1]=f2;
}
int main(){
cin>>n>>m>>p;
for(int i=1;i<=n;i++) fa[i]=i;
while(m--){
cin>>x>>y;
join(x,y);
}
while(p--){
cin>>x>>y;
if(find(x)==find(y))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
村村通(P1536)
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
int fa[100000];
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
void join(int c1,int c2){
int f1=find(c1),f2=find(c2);
if(f1!=f2) fa[f1]=f2;
}
int main(){
while(cin>>n){
if(n==0) return 0;
cin>>m;
int ans=0;
memset(fa,0,sizeof(fa));
for(int i=1;i<=n;i++) fa[i]=i;
while(m--){
cin>>x>>y;
join(x,y);
}
for(int i=1;i<=n;i++)
if(fa[i]==i) ans++;
cout<<--ans<<endl;
}
return 0;
}
修复公路(P1111)
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
const int M=1e5+5;
struct node{
int a,b,t;
}e[M];
bool cmp(node x,node y){return x.t<y.t;};
int fa[N],n,m,a,b,t,tol;
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b>>t;
e[i]=(node){a,b,t};
}
sort(e+1,e+1+m,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
a=e[i].a,b=e[i].b;
if(find(a)==find(b)) continue;
fa[find(a)]=fa[find(b)];
tol++;
if(tol==n-1){
cout<<e[i].t;
return 0;
}
}
cout<<-1;
return 0;
}