牛客小白月赛6-桃花

时间限制 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位测评。

原文地址:https://www.cnblogs.com/Leozi/p/13281229.html