hd 1232
#include<iostream>
using namespace std;
int pre[1010],sum,n,m,i,j,a,b;;
int find(int x){
int r=x;
while(pre[r]!=r) r=pre[r];
int z=r,j; //路径压缩
while(z!=r) j=pre[z],pre[z]=r,z=j; //将父亲节点的所有子树全给r
return r;
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy )pre[fx]=fy,sum--;
}
int main(){
while(cin>>n&&n){
cin>>m,sum=n-1;
for(i=1;i<=n;i++)pre[i]=i;
for(i=1;i<=m;i++)cin>>a>>b,merge(a,b);
cout<<sum<<endl;
}
}
poj2524
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,i,a,b,j=1;
int pre[50000],hash[50005],sum;
int find(int x){
int r=x;
while(pre[r]!=r) r=pre[r];
int i=x,j;
while(i!=r) j=pre[i],pre[i]=r,i=j;
return r;
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy)pre[fx]=fy;
}
int main()
{
while(cin>>n>>m,m,n)
{
sum=0;memset(hash,0,sizeof(hash));
for(i=1;i<=n;i++)
pre[i]=i;
while(m--)cin>>a>>b,merge(a,b);
for(i=1;i<=n;i++) hash[find(i)]=1;
for(i=1;i<=n;i++) sum+=hash[i];
cout<<"Case "<<j++<<": "<<sum<<endl;
}
return 0;
}
hd1233
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=110;
int pre[110],cd,n,i,j,sum;
struct act{
int x,y,z;
}a[N*N];
bool cmp(act a,act b){return a.z<b.z;}
int find(int x){
if(pre[x]==x) return x;
return pre[x]=find(pre[x]);
}
bool merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx==fy) return 0;
if(fx<fy) pre[fy]=fx;
else pre[fx]=fy;
return 1;
}
int main()
{
while(cin>>n,n){
sum=cd=0;
int m=n*(n-1)/2;
memset(pre,-1,sizeof(pre));
for(i=0;i<m;i++) cin>>a[i].x>>a[i].y>>a[i].z;
sort(a,a+m,cmp);
for(i=0;i<n;i++) pre[i]=i;
for(i=0;i<m;i++){
if(merge(a[i].x,a[i].y)){
sum+=a[i].z;
cd++;
}
if(cd==n-1) break;
}
cout<<sum<<endl;
}
return 0;
}
hd1213
#include<iostream>
#include<string.h>
using namespace std;
int pre[50],t,n,m,a,b,sum,i;
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;
}
void merge(int x,int y){
int fx=find(x),fy=find(y);
if(fx!=fy) pre[fx]=fy;
}
int main()
{
cin>>t;
while(t--){
cin>>n>>m;sum=0;
for(i=1;i<=n;i++) pre[i]=i;
for(i=1;i<=m;i++) cin>>a>>b,merge(a,b);
for(i=1;i<=n;i++) if(find(i)==i) sum++;
cout<<sum<<endl;
getchar();
}
return 0;
}