请写出这道算法题时间复杂度最低的c++代码:蒜头君和他的同事们最近在玩一个好玩的游戏:互粉攻略。一共有 NN 个人参加游戏编号从 00 到 N - 1N−1游戏前每个人都会展示自己最靓丽的一面。当游戏开始时每个人可以选择去关注别人。当 AA 关注了 BB则 AA 就成了 BB 的粉丝但是并不意味着 BB 同时关注了 AA。当所有人都选好后游戏结束人气指数最高的人成为冠军。蒜头君制定了奇怪的规定:一
算法1
并查集。对于每个人,维护他的粉丝数和关注数。对于每一条关注,将被关注者的粉丝数加一,将关注者的关注数加一。最后遍历每个人,计算他的人气指数并输出即可。
时间复杂度
并查集的时间复杂度为 $O(m\alpha(n))$,其中 $\alpha(n)$ 为阿克曼函数的反函数,接近于常数,因此时间复杂度为 $O(m)$。
C++ 代码
算法2
拓扑排序。对于每个人,维护他的入度和出度。对于每一条关注,将被关注者的入度加一,将关注者的出度加一。然后进行拓扑排序,每次选择入度为零的点并更新其后继节点的入度,直到所有节点都被访问过。最后遍历每个人,计算他的人气指数并输出即可。
时间复杂度
拓扑排序的时间复杂度为 $O(m+n)$。
C++ 代码
原文地址: https://www.cveoy.top/t/topic/eh6j 著作权归作者所有。请勿转载和采集!