hdu 1232 畅通工程

来源:互联网 发布:牵机药 知乎 编辑:程序博客网 时间:2024/06/12 01:43

主题思想: union set

union set 核心代码:

 //init        for(int i=1;i<=n;i++){            a[i]=i;            h[i]=1;        }int Find(int p){    if(a[p]==p) return p;    a[p]=Find(a[p]);}void UN(int p,int q){    p=Find(p);    q=Find(q);    if(p!=q){        if(h[p]<h[q]){            a[q]=a[p];            h[p]=h[p]+h[q];        }else{            a[p]=a[q];            h[q]=h[q]+h[p];        }    }}AC代码:

include

include

include

using namespace std;

const int maxn=1005;

int a[maxn];
int h[maxn];
int n,m;

int Find(int p){

if(a[p]==p) return p;a[p]=Find(a[p]);

}

void UN(int p,int q){

p=Find(p);q=Find(q);if(p!=q){    if(h[p]<h[q]){        a[q]=a[p];        h[p]=h[p]+h[q];    }else{        a[p]=a[q];        h[q]=h[q]+h[p];    }}

}
int main()
{
int p,q;
while(scanf(“%d”,&n)!=EOF){

    if(n==0) break;    //init    for(int i=1;i<=n;i++){        a[i]=i;        h[i]=1;    }    scanf("%d",&m);    for(int i=1;i<=m;i++){        scanf("%d%d",&p,&q);        UN(p,q);    }    int ans=0;    for(int i=1;i<=n;i++){        if(a[i]==i) ans++;    }    printf("%d\n",ans-1);}return 0;

}

“`

原创粉丝点击