最一道题还算是一个经典的dfs算法题,我希望通过这一道题,能够帮助我们一些初学者,更好的帮助
创栈和字典
将输入的信息进行转换为一个字典类型,通过python自带的collections.defaultdict 进行整理,并且同过栈将value 为1的放进栈中。
adjs=collections.defaultdict(list)
for x in edges: # 图的邻接表表示法,基本是模板
adjs[x[0]].append(x[1]) # 1:{2}
adjs[x[1]].append(x[0]) # 2:{1}
queue = deque() # 固定写法
for key, value in adjs.items():
if len(value) == 1:
queue.append(key)
进行bfs算法
在bfs算法将其叶子节点给删去,和有叶子节点的字典中value删去
while(queue): # 固定写法
size = len(queue) # 固定写法
n = n - size
for _ in range(size):
v = queue.popleft()
v_adj = adjs[v].pop() # v的邻接仅一个,弹出即删除
adjs[v_adj].remove(v) # 在v的邻接元素的邻接列表里删除v
if len(adjs[v_adj]) == 1:
queue.append(v_adj)
记得考虑情况,当n=1,时只有一个数,就是本身,n=2时两个数都可以当根节点,下面是全部的代码
import collections
n=int(input())
edges=[[1,0],[1,2],[1,3]] #这个是自己随便输入的
if n == 2:
print([0,1])
if n == 1:
print([0])
adjs = collections.defaultdict(list) # defaultdict写法很有用
for x in edges: # 图的邻接表表示法,基本是模板
adjs[x[0]].append(x[1]) # 1:{2}
adjs[x[1]].append(x[0]) # 2:{1}
# BFS队列: 初始队列放入初始元素,size=1的为叶子,入队
queue = collections.deque() # 固定写法
for key, value in adjs.items():
if len(value) == 1:
queue.append(key)
# BFS两个大循环
while(queue): # 固定写法
size = len(queue) # 固定写法
n = n - size
for _ in range(size):
v = queue.popleft()
v_adj = adjs[v].pop() # v的邻接仅一个,弹出即删除
adjs[v_adj].remove(v) # 在v的邻接元素的邻接列表里删除v
if len(adjs[v_adj]) == 1:
queue.append(v_adj)
if n == 1:
print( [queue.popleft()])
if n == 2:
print([queue.popleft(), queue.popleft()])