(1)类型:并查集。
(2)题意:中文题。
(3)时间复杂度:并查集简单题,时间复杂度够小但当复杂一点的并查集的题目,会卡c++的输入流输出流的时间,所以当遇到复杂的并查集题目,输入输出尽量用scanf();
(4)代码:
#include<iostream>
using namespace std;
const int MAX=1e3+6;
int n,m,ans,par[MAX];
int GetPar(int a){return par[a]==-1?a:par[a]=GetPar(par[a]);}
void Merge(int a,int b){
int p1=GetPar(a),p2=GetPar(b);
if(p1!=p2)par[p1]=p2;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
while(cin>>n>>m,n){ans=0;
for(int i=1;i<=n;i++)par[i]=-1;
for(int i=1;i<=m;i++){
int a,b;cin>>a>>b;
Merge(a,b);
}
for(int i=1;i<=n;i++)
if(par[i]==-1)ans++;
cout<<ans-1<<endl;
}
}
本文介绍了一道关于并查集的算法题目,详细解析了如何使用并查集解决中文问题,并给出了具体的C++实现代码。文章重点介绍了并查集的时间复杂度及优化技巧。
839

被折叠的 条评论
为什么被折叠?



