HDU 1213 How Many Tables
并查集简单题——复习
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<iomanip>
#include<bitset>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<set>
#include<queue>
#include<map>
#include<vector>
#define ll long long
#define lowbit(x) (x)&(-x)
using namespace std;
const ll inf = 0x3f3f3f3f;
typedef pair<int,int> PII;
int pre[1050];
int find(int x){
if(x!=pre[x])
pre[x]=find(pre[x]);
return pre[x];
}
int main(){
//#define io
#ifdef io
freopen("in.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
pre[i]=i;
}
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
int xx=find(x),yy=find(y);
if(xx!=yy){
pre[yy]=xx;
}
}
int ans=0;
for(int i=1;i<=n;i++){
if(find(i)==i)
ans++;
}
cout<<ans<<endl;
}
}
防爆炸
#include<iostream>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<iomanip>
#include<bitset>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<set>
#include<queue>
#include<map>
#include<vector>
#define ll long long
#define lowbit(x) x&-x
using namespace std;
const ll inf = 0x3f3f3f3f;
typedef pair<int,int> PII;
int pre[1050];
int find(int x){//数据规模巨大,防爆栈版
int r=x;
while(r!=pre[r]) r=pre[r];
int i=x,j;
while(i!=r){
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
int main(){
//#define io
#ifdef io
freopen("in.txt","r",stdin);
#endif
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
pre[i]=i;
}
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
int xx=find(x),yy=find(y);
if(xx!=yy){
pre[yy]=xx;
}
}
int ans=0;
for(int i=1;i<=n;i++){
if(find(i)==i)
ans++;
}
cout<<ans<<endl;
}
}