题解 | #牛牛掷硬币#

算法交流群

http://www.nowcoder.com/practice/397cf1012db14edebe6e91479d536171

根据题意,我们可以建立一个有向无环图,并统计其入度,之后在图上进行拓扑排序,每次当我们遍历到一个节点时,判断其是否可以解决自身产生的问题,同时我们记录每个成员当前所接受的其他问题,分别统计解决问题个数即可。

import collections
class Solution:
    def solve(self , n , a , p , k ):
        # write code here
        ans = [0] * n
        edges = collections.defaultdict(int)
        indegree = [0] * n
        for i in range(n - 1):
            edges[i + 1] = p[i] - 1
            indegree[p[i] - 1] += 1

        queue = []
        que = collections.defaultdict(list)
        visited = set()
        for i in range(len(indegree)):
            if indegree[i] == 0:
                queue.append(i)
                visited.add(i)

        while queue:
            cur_node = queue.pop(0)
            if cur_node == 0:
                g = -1
            else:
                g = edges[cur_node]

            if k[cur_node] <= a[cur_node]:
                ans[cur_node] += 1
            else:
                if g != -1:
                    que[g].append(k[cur_node])
            for q in que[cur_node]:
                if q <= a[cur_node]:
                    ans[cur_node] += 1
                else:
                    if g != -1:
                        que[g].append(q)
            if g != -1:
                indegree[g] -= 1
                if indegree[edges[cur_node]] == 0 and edges[cur_node] not in visited:
                    visited.add(edges[cur_node])
                    queue.append(edges[cur_node])
        return ans
全部评论

相关推荐

我的offer呢😡:这不才9月吗,26到明年毕业前能一直找啊,能拿下提前批,转正的,offer打牌的都是有两把刷子的,为什么非要跟他们比。如果别人是9本硕+金牌+好几段大厂实习呢?如果别人是双非通天代呢?如果别人是速通哥呢?,做好自己就行了,我们做不到他们一样提前杀死比赛,但晚点到终点也没啥关系吧
双非应该如何逆袭?
点赞 评论 收藏
分享
牛客吹哨人:哨哥晚点统一更新到黑名单:能救一个是一个!26届毁意向毁约裁员黑名单https://www.nowcoder.com/discuss/1525833
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务