5970. 参加会议的最多员工数(基环树)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5970. 参加会议的最多员工数(基环树)相关的知识,希望对你有一定的参考价值。

5970. 参加会议的最多员工数

思路

本题模型是内向基环树,答案分为两种情况:

1.长度大于2的环

2.所有的 长度为2的环加上两条最长链 的和。

对于第一种情况,直接暴力标记找环即可。

对于第二情况,直接拓扑后dp,这样dp得到的dp数组肯定是非环链的答案,因为环上的点不可能遍历到。

然后对两种情况取max即可。

class Solution 
public:
    bool b[100001];
    int d[100001], c[100001], f[100001];
    int maximumInvitations(vector<int>& a) 
        memset(d, 0, sizeof(d));
        for (auto i : a)
            d[i]++;
        int n = a.size(), k = 0;
        for (int i = 0; i < n; i++) 
            if (!d[i])
                c[++k] = i;
        
        
        for (int l = 1; l <= k; l++) 
            int m = c[l];
            f[a[m]] = max(f[a[m]],f[m]+1);
            if (!(--d[a[m]]))
                c[++k] = a[m];
        
        
        int ans = 0;
        memset(b, false, sizeof(b));
        for (int i = 0; i < n; i++)
            if (d[i] && !b[i]) 
                b[i] = true;
                int j = i, z = 1;
                j = a[j];
                for (; j != i; b[j] = true, j = a[j], ++z);
                ans = max(ans, z);
            
        
        int res = 0;
        for (int i = 0; i < n; i++)
            if (a[i] > i && a[a[i]] == i)
                res += 2 + f[i]+f[a[i]];
        return max(res, ans);
    
;

以上是关于5970. 参加会议的最多员工数(基环树)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 2127. 参加会议的最多员工数

H - Traffic Network in Numazu HDU - 6393(基环树)

P5049 旅行(数据加强版)(基环树)

[HDU 5304] 基环树计数

Session in BSU CodeForces - 1027F(思维 树 基环树 离散化)

[bzoj2878][Noi2012]迷失游乐园(基环树dp)