牛客练习赛24 B凤 凰(并查集考察)

链接:https://www.nowcoder.com/acm/contest/157/B
来源:牛客网
 

题目描述

    凤凰于飞,翙翙其羽,亦集爰止。

                                        ——《诗经·卷阿》

    传说,凤凰是百鸟之王。有一天,凤凰要召开百鸟大会,百鸟国是一个由n个节点组成的树,每个节点有一只鸟,开会的节点定在1号节点。每只鸟可以花费1s通过一条边,由于每根树枝(边)的载重有限,只允许一只鸟同时通过。作为会议的策划师,HtBest想知道百鸟国的所有鸟在1点集合最少需要多少秒。

 

输入描述:

第一行有一个正整数n,表示百鸟国节点个数。
接下来n-1行,第i行两个正整数ai,bi用空格隔开,表示树上节点ai,bi之间有一条边。

输出描述:

第一行一个整数,表示集合最少需要的时间。

 

示例1

输入

复制

3
1 2
2 3

输出

复制

2

示例2

输入

复制

3
1 2
1 3

输出

复制

1

示例3

输入

复制

4
1 2
2 3
2 4

输出

复制

3

备注:

对于100%的测试数据:
1 ≤ n ≤ 1000000
数据量较大,注意使用更快的输入输出方式。

 

此题是对并查集的考察;

思路:

根节点的下面分节点每次向他传送一直鸟;时间均匀,并且每一个分节点都有一只鸟;所以我们把根节点去掉;

算出剩下几棵树最大的分节点有多少个就是最终的答案’

 

#pragma GCC optimize(2)

#include 

#define maxn 1000005

typedef long long ll;

using namespace std;

ll mod = 1e9 + 7;

ll a[maxn],b[maxn],q[maxn];

int find(ll x)
{
    return a[x] == x ? x : a[x] = find(a[x]);
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);

    ll n;
    cin >> n;

    for(int i = 1; i <= n; i ++)
    {
        a[i] = i;
    }

    ll m = n - 1;
    while(m--)
    {
        ll x,y;
        cin >> x >> y;
        if(x == 1 || y == 1)continue;
        ll fx = find(x);
        ll fy = find(y);
        if(fx != fy)
        a[fx] = fy;
    }

    ll ma = 0;
    for(int i = 2; i <= n ; i ++)
    {
        ll po = find(i);
        b[po]++;
        ma = max(ma,b[po]);
    }
    cout << ma << endl;

    return 0;
}

 

你可能感兴趣的:(并查集)