时间限制 | 1000ms | 空间限制 | 262144KB |
题目:
桃花一簇开无主,可爱深红映浅红。
——《题百叶桃花》
桃花长在桃树上,树的每个节点有一个桃花,调皮的HtBest想摘尽可能多的桃花。HtBest有一个魔法棒,摘到树上任意一条链上的所有桃花,由于HtBest法力有限,只能使用一次魔法棒,请求出Htbest最多可以摘到多少个桃花。
输入:
第一行有一个正整数n,表示桃树的节点个数。
接下来n-1行,第i行两个正整数ai,bi ,表示桃树上的节点ai,bi之间有一条边。
1<=n<=1000000.数据很大用scanf。
输出:
第一行一个整数,表示HtBest使用一次魔法棒最多可以摘到多少桃花。
样例输入:
4
1 2
2 3
3 4
样例输出:
4
思路:树的直径
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
#define ONF 0xc0c0c0c0
using namespace std;
typedef long long ll;
int par[1000005],num[1000005];
void init(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
num[i]=1;
}
}
int get_par(int x)
{
return par[x]==x?x:par[x]=get_par(par[x]);
}
void doit(int x,int y)
{
int dx=get_par(x);
int dy=get_par(y);
if(dx!=dy)
{
par[dx]=dy;
num[dy]=num[dx]+num[dy];
}
}
int main()
{
int n,x,y;
scanf("%d",&n);
init(n);
for(int i=1;i<=n-1;i++)
{
scanf("%d %d",&x,&y);
doit(x,y);
}
int Max=0;
for(int i=1;i<=n;i++)
{
Max=max(Max,num[i]);
}
printf("%d
",Max);
}
注意:这个题要用int,用long long 会超时,貌似long long 运算比int 要慢点如果是32位测评。