看看浙大学长(排名前20)的答案,好好学习




附上一个链接表示respect!
力扣原题答案

我的理解:
每个联通分量有且仅有一环
环中若只有2node,则需要反向找出最长的树枝(两边都找)
环中若大于2node,由于树枝节点不可进环,树枝节点不可成环,所以最多的人数就是环中人数

代码思路:

代码:

class Solution:def maximumInvitations(self, g: List[int]) -> int:# favorite就是内向基环森林gn = len(g)rg = [[] for _ in range(n)] # g的反图deg = [0] * n # g上每个点的入度for v, w in enumerate(g):# 反图就是w指向vrg[w].append(v)deg[w] += 1#print(deg)#print(rg)# 拓扑排序,剪掉g上的树枝# deque是双向队列, 找出入度为0的q = deque(i for i, d in enumerate(deg) if d == 0)#print(q)# 递归找树枝while q:# v是树枝末梢v = q.popleft()# 树枝的上一个w = g[v]# 剪掉树枝vdeg[w] -= 1# 判断剪掉v后w是否变成了树枝末梢# 这时候deg为0的都变成了树枝if deg[w] == 0:# 右边加q.append(w)# 通过反图rg寻找树枝上最深的链def rdfs(v: int) -> int:max_depth = 1# v的反图中for w in rg[v]:# 若入度为0,则是树枝节点if deg[w] == 0:max_depth = max(max_depth, rdfs(w) + 1)return max_depth# 找出环元素>2的最大环元素个数# 找出换元素=2的最长树枝深度(包括基环那两个)max_ring_size, sum_chain_size =0, 0for i, d in enumerate(deg):# 不管树枝if d <= 0:continue# 遍历基环上的点deg[i] = -1ring_size = 1v = g[i]while v != i:deg[v] = -1 #将基环上的点的入度标记为-1,避免重复访问ring_size += 1v = g[v]# 若基环大小为2if ring_size == 2:# 累计两条最长链的长度sum_chain_size += rdfs(i) + rdfs(g[i])else:# 取所有基环的最大值max_ring_size = max(max_ring_size, ring_size)return max(max_ring_size, sum_chain_size)

基环为2之所以可以累加的解释

总结:
1.这种谁喜欢谁模型可是内向基环图森林
2.基环大于2,则不可插入,且树枝不可组合,所以此时最大人数为基环(基环构成一个圈)
3.基环等于2,要计算两边各自最长链的和,且所有基环等于2的可以拼接起来
4.用rg、deg和enumerate记录反图(找最长链)和度数
5.用双向队列deque+拓扑排序(满足边的先后关系)找到所有树枝
6.dfs找反向的最长链
7.遍历deg,找出环中的点,分>2和==2两种情况
8.两者取max

leetcode:20210102周赛第四题——参加会议的最多员工数(基环树+找树枝+dfs最长树枝)相关推荐

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

    一个公司准备组织一场会议,邀请名单上有 n 位员工.公司准备了一张 圆形 的桌子,可以坐下 任意数目 的员工. 员工编号为 0 到 n - 1 .每位员工都有一位 喜欢 的员工,每位员工 当且仅当 他 ...

  2. [Leetcode]5970. 参加会议的最多员工数

    [题目描述] 力扣https://leetcode-cn.com/problems/maximum-employees-to-be-invited-to-a-meeting/ 一个公司准备组织一场会议 ...

  3. Leetcode69场双周赛-第四题5931. 用邮票贴满网格图

    5931. 用邮票贴满网格图 题目描述 解题思路 查找标志为0的点,尝试以该点为邮票的左上角,直到尝试为以该点为邮票的右下角.如果能放邮票,并覆盖该为0 的点,则把覆盖的点标志为2.如果不能,直接返回 ...

  4. 矩阵中和能被 K 整除的路径 leetcode第314周赛第四题

    给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k .你从起点 (0, 0) 出发,每一步只能往 下 或者往 右 ,你想要到达终点 (m - 1, n - 1) . 请你返回路 ...

  5. [leetcode 10-4] 三、分割数组最多方案(双周赛第四题)

    class Solution:def waysToPartition(self, nums: List[int], k: int) -> int:# 同时给你一个整数 k .你可以将 nums ...

  6. leetcode - b 199场周赛(缺第四题)

    1- 5472. 重新排列字符串 给你一个字符串 s 和一个 长度相同 的整数数组 indices . 请你重新排列字符串 s ,其中第 i 个字符需要移动到 indices[i] 指示的位置. 返回 ...

  7. 当单调栈遇到了前前缀和(Leetcode 2281. 巫师的总力量和、力扣第 294 场周赛第 4 题)

    2281. 巫师的总力量和(力扣第 294 场周赛第 4 题) 这道题做起来比较复杂.需要单调栈.前缀和.数学计算. 一句话概括思路:在 907. 子数组的最小值之和 中,是对每个 min 乘以管辖范 ...

  8. LeetCode 第 59 场力扣夜喵双周赛(最短路径数+迪杰斯特拉、动态规划+最长公共前缀问题) / 第255场周赛(二进制转换,分组背包,子集还原数组(脑筋急转弯))

    第 59 场力扣夜喵双周赛 两道400多五百,后两道都写出代码来了,但是都有问题,哭辽- 还有刚开始第一道测试好慢,搞心态了 5834. 使用特殊打字机键入单词的最少时间 有一个特殊打字机,它由一个 ...

  9. 【LeetCode 剑指offer刷题】查找与排序题14:Wiggle Sort(系列)

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) Wiggle Sort II Given an unsorted array nums, reorder it su ...

最新文章

  1. Python网络爬虫 - 一个简单的爬虫例子
  2. AIX上报:“Shell will time out in 60 seconds” 解决办法
  3. Bada学习- C++以及Flash应用开发流程之创建应用工程
  4. #ifndef的作用
  5. Oracle客房管理系统论文,[转载]基于WEB的酒店管理系统论文【1】
  6. [PA 2014]Kuglarz
  7. mysql两台服务器怎么做数据同步_让两台服务器的MySQL数据同步(互为主从关系)...
  8. C#6.0 十大常用特性
  9. 解读Depth Map Prediction from a Single Image using a Multi-Scale Deep Network (1)
  10. Java怎样获项目路径_java项目中获取路径的方式
  11. OPPO K9 Pro刷root强解锁BL刷面具Magisk框架 oppo k9pro root教程
  12. 注册表怎么用计算机管理打开,如何打开注册表,详细教您如何打开电脑注册表管理器...
  13. git基础命令以及用法
  14. 阿里巴巴集团升级中台战略! 任命张建锋(行癫)为首席技术官(CTO)
  15. token的颁发、保存与携带
  16. 微信公众平台开发(92) 多客服(转)
  17. 百度云服务器远程密码忘记,2020-11-17 新买了百度云服务器,如何用ssh远程登陆...
  18. java 向上转型与向下转型
  19. 它被称为“蓝领”的编程语言!90%的财富500强公司都在使用!
  20. 跨考计算机应该怎么学,跨考计算机考研经验分享

热门文章

  1. linux内核开发入门二(内核KO模块介绍、开发流程以及注意事项)
  2. html5 表单for,HTML5 for(网页表单制作)(姬岚洋).doc
  3. 皮尔逊相关系数_Pearson相关系数要求双变量正态分布,是两个变量均服从正态分布吗?...
  4. 复试不歧视的计算机院校,不歧视双非,保护一志愿!40所“良心”大学有你的选择吗?...
  5. win10计算机默认用户名和密码是什么,win10共享的文件夹需要密码和用户名登陆...
  6. 整数按位异或运算 C语言
  7. 智能爆炸不会发生,AI将线性发展:Keras作者François Chollet热文
  8. 华为悦盒ec6108v9c使用ADB通过U盘刷Linux(Ubuntu)并使用docker部署alist服务器
  9. 日语二级考试之形容词小结
  10. ansible firewalld 模块