hdu 1231 畅通工程 并查集初步

来源:互联网 发布:mac微博客户端是什么 编辑:程序博客网 时间:2024/06/14 08:20

传送门:hdu 1231 畅通公路
中文题目就不做过多的解释了

解题思路

这个题目主要考察的并查集简单合并和查找,没有压缩路径。
但是在这里说一下路径压缩的两种方法(递归和非递归)
递归:

int find(int x){    return pre[x] = (x!=pre[x])?find(pre[x]):pre[x];}

非递归的就相对来说有点麻烦了

int find(int x){    int r = x;//保存下x这个值    while(r!=pre[r])        r = pre[r];  //一直找到x的根节点    int i = x,j;    while(pre[i] != r )   //该节点不是根节点    {        j = pre[i];//保存下这个节点        pre[i] = r;//把这个节点的父节点指向根节点        i = j;//把i变为以前的父节点    }    return r;}

AC代码

#include<cstdio>#include<cstring>#define mst(a,b) memset(a,b,sizeof a);const int MAXN = 1e3+5;int pre[MAXN];int find(int x){    return pre[x] = (x!=pre[x])?find(pre[x]):pre[x];}void join(int x,int y){    int fx = find(x),fy = find(y);    if(fx!=fy)        pre[fx] = fy;}int main(){    int n,m;    int a,b;    int tmp[MAXN];    while(~scanf("%d",&n) && n)    {        scanf("%d",&m);        for(int i=1;i<=n;i++)pre[i] = i;        for(int i=1;i<=m;i++)        {            scanf("%d%d",&a,&b);            join(a,b);        }        mst(tmp,0);        int ans = 0;        for(int i=1;i<=n;i++)        {            tmp[find(i)]++;            if(tmp[find(i)] == 1)                ans++;        }        printf("%d\n",ans-1);    }    return  0;}
0 0
原创粉丝点击