HDU----1232(并查集)

题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1232
重要代码

{
	int find(int x)//find函数查找根节点 
		return x;
	return pre[x]=find(pre[x]) ;//pre[]记录前导点 
 } 
 void join(int x,int y)
 {//判断 x,y 是否连通 
 	int fx=find(x);
 	int fy=find(y);
 	if((x!=fy))
 	pre[fx] = fy;
 }

具体代码

#include <bits/stdc++.h>
using namespace std;
int bin[1003];
int find(int x)
{
    if(x==bin[x])
        return x;
    bin[x]=find(bin[x]);
    return bin[x];
}

void join(int a, int b)
{
    int fx=find(a);
    int fy=find(b);
    if(fy!=fx)
	{
        bin[fy]=fx;
    }
}

int main(int argc, char **argv)
{
	int n,m;
    while(~scanf("%d",&n) && n)
	{
        scanf("%d",&m);
        if(m==0)
		{
            printf("%d\n",n-1);
            continue;
        }
        for(int i=1; i<=n; i++)
		{
            bin[i]=i;
        }
        int u,v;
        for(int i=0; i<m; i++)
		{
            scanf("%d%d",&u,&v);
            join(u,v);
        }
        int ans=0;
        for(int i=1; i<=n; i++)
		{
            if(bin[i]==i)
			{
                ans++;
            }
        }
        printf("%d\n",ans-1);
    }
	return 0;
}

上一篇:windows下使用Jenkins+Gitea持续集成


下一篇:PTA 朋友圈 (25 分) 代码详解 (并查集)