并查集入门题 hd1232 poj2524 hd1233 hd1213

来源:互联网 发布:渲染软件主机配置 编辑:程序博客网 时间:2024/06/06 05:24
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; //将父亲节点的所有子树全给rreturn 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;}





原创粉丝点击