HDU 1856

时间:2021-09-15 08:22:40

http://acm.split.hdu.edu.cn/showproblem.php?pid=1856

HDU 1856

对于这道题,主要就是让你求出有最多结点的树的树叶;

我们只要利用并查集的知识吧所输入的数据连接成树,然后逐一找出树叶最多的树就可以。利用一个num数组,在最开始的时候每个节点自己是一颗树,num[i]=1;在之后把在同一个父亲结点的num[i]连接起来。

再逐一查找出最大的就可以啦。

思路就是这样啊,可是我的提交上就是wa,心灰意冷啊,啊,啊啊,啊啊啊。我把我的代码贴上面,希望大神们看见帮我改一改。

 #include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=;
int fa[M],num[M];
void init(){
for(int i=;i<=M;i++){
fa[i]=i;
num[i]=;
}
}
int fin(int x){
return fa[x]=x?fa[x]:fa[x]=fin(fa[x]);
}
void unin(int x,int y){
int p=fin(x);
int q=fin(y);
if(p!=q){
fa[p]=q;
num[q]+=num[p];
}
}
int main()
{
int n,a,b;
while(~scanf("%d",&n)){
if(n==){
printf("1\n");
continue;
}
int ans=;
init();
for(int i=;i<n;i++){
scanf("%d%d",&a,&b);
if(a>ans)ans=a;
if(b>ans)ans=b;
unin(a,b); }
int maxn=;
for(int i=;i<=ans;i++){
if(num[i]>maxn)
maxn=num[i];
}
cout<<maxn<<endl;
}
return ;
}

下面的这个是我在网上查找的大神的代码,我俩除啦参数之外是一样一样的啊,我的咋就不过呢。。。。。

 #include<stdio.h>
#define N 10000000
int father[N],num[N];
void initial()/*初始化*/
{
int i;
for(i=;i<=N;i++)
{
father[i]=i;
num[i]=;/*开始时数量都为1,根节点为自己*/
}
}
int find(int x) /*寻找根节点*/
{
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void merge(int a,int b)/*合并a和b*/
{
int p=find(a);
int q=find(b);
if(p!=q)
{
father[p]=q;
num[q]+=num[p];/*合并集合中元素个数*/
}
}
int main()
{
int n,a,b,i,sum,max;
while(~scanf("%d",&n))
{
if(n==)
{
printf("1\n");
continue;
}
max=;
initial(); /*初始化*/
for(i=;i<n;i++)
{
scanf("%d%d",&a,&b);
if(a>max)
max=a;
if(b>max)
max=b;
merge(a,b); /*合并集合*/
}
int Max=;
for(i=;i<=max;i++)
if(num[i]>Max) /*查找最大值*/
Max=num[i];
printf("%d\n",Max);
}
return ;
}