代码拉取完成,页面将自动刷新
# -*- coding: utf-8 -*-
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/9/9
# @File : D - Pair of Balls(图论+建模+拓扑排序).py
# https://atcoder.jp/contests/abc216/tasks/abc216_d
from collections import deque
def create_indegree():
"""
建立每个节点的入度数组,数组在做拓扑排序的过程中会不断变化。
:return:
"""
for u in table:
for v in u:
indegree[v] += 1
def topsort():
"""
进行拓扑序列的建立,也就做一个拓扑排序出来
:return: 拓扑序列的长度(即可以删掉的个数,如果不等于n那就说明No了)
"""
Q = deque([i for i in range(1, n + 1) if indegree[i] == 0])#入度为0的入队
tp = []
while Q:
u = Q.pop()#出队顺序无所谓,拓扑排序不唯一
tp.append(u)#加入到拓扑序列记录数组中
for v in table[u]:#所有以u为尾的边指向的节点的入度都要减一,有向边没箭头那端为尾
indegree[v] -= 1
if indegree[v] == 0:#新的变成了入度为0的入队
Q.append(v)
return len(tp)
"""
先建立邻接表。每种颜色转化成一个点。模型建的不完整搞了一天!!!模型缺了一部分。
只想到想拿第二个就一定要先拿掉第一个,但是没考虑到想拿第三个就要必须拿掉第二个。所以一个圆柱里的数是拓扑的。所以不要直接拿圆柱当邻接表!
216题解:https://www.cnblogs.com/ooctober/p/15218166.html 是看这个代码顿悟的。
建模过程,每次要拿掉最上面两个颜色相同的,就代表其实这种颜色是入度为零的,因为没有任何其他颜色指向这种颜色,因为这种颜色的两个球都在最顶,都是指别人。
"""
if __name__ == '__main__':
n, m = map(int, input().split())
table = [list() for i in range(n + 1)]
#建表过程:
for i in range(m):
k = int(input())
pre = 0#起点
for j in input().split():
if pre != 0:#第一轮循环不会进入这个if。
table[pre].append(int(j))
pre = int(j)#下一个变为起点
"""
那昨天你只建一层图也只差一个样例就过了?
错误的例子:直接除了圆柱第一个后面的直接加进去邻接表。
k = int(input())
a = [int(j) for j in input().split()]
table[a[0]] += (a[1:])
这样就等于只有第一个点到后面的各个点的边,然后后面的点之间就没有关系,这样是错误的,建模没建完整,没考虑到想拿第三个就要必须拿掉第二个,并以此类推的。一个圆柱其实一个图的形状是单链表的图。
所以圆柱的样子并不能直拿来当邻接表!
重边是这样:1 2
:1 2 这样1这个点就有两条边指向2
自环是这样:1 1 这样1就有一条边指向1(自己)
这两个细节都不是代码出问题的地方。
"""
indegree = [0] * (n + 1)
create_indegree()#建立存着每个节点的入度的数组
ans = topsort()
if (ans == n):
print("Yes")
else:
print("No")
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。