HDU 1232 畅通工程 (并差集)

来源:互联网 发布:看看电视剧的软件 编辑:程序博客网 时间:2024/05/16 12:26

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1232

代码:

#include <iostream>#include <string.h>#include <set>#include<stdio.h>using namespace std;int pre[1005];int n;int father(int n){    int tf = (pre[n] == n) ? n : father(pre[n]);    pre[n] = tf;    return pre[n];}void unin(int a, int b){    int fa = father(a);    int fb = father(b);    if (fa == fb)    {        return;    }    if (fa < fb)    {        pre[fb] = fa;    }    else    {        pre[fa] = fb;    }}void init(){    for(int i=1;i<=n;i++)        pre[i]=i;}int main(){    int m,x,y;    while(~scanf("%d",&n))    {        if(n==0)            return 0;        scanf("%d",&m);        bool ans[1005];        //memset(pre,0,sizeof(pre));        memset(ans,0,sizeof(ans));        init();        for(int i=0; i<m; i++)        {            scanf("%d%d",&x,&y);            //if(x<=n&&y<=n)            {                unin(x,y);                //unin(y,x);            }        }        /*for(int i=1;i<=n;i++)        {            printf("%d ",pre[i]);        }*/        for(int i=1; i<=n; i++)        {            ans[father(i)]=1;                  //刚开始是pre[i],无限WA。但为什么是father(i)呢?        }        int ok=0;        for(int i=1; i<=n; i++)        {            if(ans[i]==1)                ok++;        }        cout<<ok-1<<endl;        /*        set<int> rs;        for (int i = 1; i <= n; i++)        {            rs.insert(father(i));        }        printf("%d\n", rs.size() - 1);        */    }}


找到了 好像是输入数据的点大于n。即存在 5 1 1 6这种情况。玩心机呀。

所以不能标记pre[i],因为1与6连的时候,pre[1]=0.

0 0