晚上好🌙🌙🌙
本答案参考ChatGPT-3.5
class Node:
def __init__(self, x):
self.val = x
self.next = None
def print_neighbors(head):
if not head:
return []
ans = []
cur = head
while cur and cur.next:
neighbors = [cur.next.val]
next_index = cur.next.index(cur)
for i in range(next_index+1, len(cur.next)):
neighbors.append(cur.next[i].val)
ans.extend(neighbors)
cur = cur.next
return ans
def simulate链条表(N, M):
node_list = [Node(i) for i in range(N)]
for _ in range(M):
u, v = map(int, input().split())
node_list[u-1].next = node_list[v-1]
edges = set()
for node in node_list:
for edge in node_list[node]:
if edge != (node, edge-1):
edges.add(edge)
neighbors = [node.val for node in node_list if node != (node, (node, edge-1))]
return print_neighbors(node_list[-1])
print_simulate链条表(100000, 100000))
注意:这里使用了set
数据结构去存储已经加入过的边。虽然在Python中我们并不需要直接维护一个集合,但是将元素添加到集合中的过程会使得我们不需要重新计算这个集合,因此用它可以节省时间和空间。
时间限制:在给定的时间范围内,程序需要执行至少次。
内存限制:在给定的内存限制内,程序需要执行至少次。
15.00分 1s 64MByte
这是一个相对复杂的问题,因为我们需要维护所有节点的下一个节点的信息,并且还要对邻接表进行排序。这个问题可以简化为只遍历一次链表,并且在每次循环中更新邻接表的顶点信息。以下是解决方案:
class Node:
def __init__(self, x):
self.val = x
self.next = None
def print_neighbors(head):
if not head:
return []
ans = []
cur = head
while cur and cur.next:
neighbors = [cur.next.val]
next_index = cur.next.index(cur)
for i in range(next_index+1, len(cur.next)):
neighbors.append(cur.next[i].val)
ans.extend(neighbors)
cur = cur.next
return ans
def simulate链条表(N, M):
node_list = [Node(i) for i in range(N)]
for _ in range(M):
u, v = map(int, input().split())
node_list[u-1].next = node_list[v-1]
edges = set()
for node in node_list:
for edge in node_list[node]:
if edge != (node, edge-1):
edges.add(edge)
nodes = [node.val for node in node_list if node != (node, (node, edge-1))]
nodes.sort(key=lambda x: x)
return print_neighbors(nodes[-1])
print_simulate链条表(100000, 100000))
这段代码首先将输入转换为整数,然后创建了一个从头节点开始的邻接表。接下来,它将输入的边按照索引顺序添加到邻接表中,并将每个边的信息(起始顶点和结束顶点)存储在一个列表中。最后,它将所有的顶点按值从小到大排序,并返回结果。