第4期:自训 2022/1/12
2022/1/18 23:40:51
本文主要是介绍第4期:自训 2022/1/12,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1 P3367 【模板】并查集
参考资料
#include<bits/stdc++.h> using namespace std; const int M=2e5+10,N=1e4+10; int n,m,x,y,z; int pre[N]; int rk[N]; int find(int x){ if(pre[x]==x) return x; return pre[x]=find(pre[x]); } bool isSame(int x,int y){ return find(x)==find(y); } void join(int x,int y){ x=find(x); y=find(y); if(x==y) return; if(rk[x]>rk[y]) pre[y]=x; else{ if(rk[x]==rk[y]) rk[y]++; pre[x]=y; } } int main(){ ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++){ pre[i]=i; rk[i]=1; } while(m--){ cin>>z>>x>>y; if(z==1){ join(x,y); }else if(z==2){ if(isSame(x,y)) cout<<"Y"<<endl; else cout<<"N"<<endl; } } return 0; }
2 P1551 亲戚
还是并查集
#include<bits/stdc++.h> using namespace std; const int N=5e3+100; int n,m,p; int pre[N]; int rk[N]; int find(int x){ if(pre[x]==x) return x; return pre[x]=find(pre[x]); } bool isSame(int x,int y){ return find(x)==find(y); } void join(int x,int y){ x=find(x); y=find(y); if(x==y) return; if(rk[x]>rk[y]) pre[y]=x; else{ if(rk[x]==rk[y]) rk[y]++; pre[x]=y; } } int main(){ ios::sync_with_stdio(0); cin>>n>>m>>p; for(int i=1;i<=n;i++){ pre[i]=i; rk[i]=1; } while(m--){ int x,y; cin>>x>>y; join(x,y); } while(p--){ int a,b; cin>>a>>b; if(isSame(a,b)) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }
3 P2078 朋友
还是并查集
#include<bits/stdc++.h> using namespace std; const int N=2e4+100; int n,m,p,q,x,y; int pre[N]; int rk[N]; int find(int x){ if(pre[x]==x) return x; return pre[x]=find(pre[x]); } bool isSame(int x,int y){ return find(x)==find(y); } void join(int x,int y){ x=find(x); y=find(y); if(rk[x]>rk[y]) pre[y]=x; else{ if(rk[x]==rk[y]) rk[y]++; pre[x]=y; } } int main(){ ios::sync_with_stdio(false); cin>>n>>m>>p>>q; for(int i=1;i<=n;i++){ pre[i]=i; rk[i]=1; } for(int i=n+1;i<=n+m;i++){ pre[i]=i; rk[i]=1; } rk[1]=N;rk[n+1]=N; while(p--){ cin>>x>>y; join(x,y); } while(q--){ cin>>x>>y; x*=-1;y*=-1; join(x+n,y+n); } int ans1=0,ans2=0; for(int i=1;i<=n;i++){ if(find(i)==1) ans1++; } for(int i=n+1;i<=n+m;i++){ if(find(i)==n+1) ans2++; } cout<<min(ans1,ans2)<<endl; return 0; }
这篇关于第4期:自训 2022/1/12的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南