for i in range(1, n + 1):
if rudu[i] == 0:
root = i # 入度为0的是根节点,找到根节点,从根节点开始遍历。
def dfs(u):
同时记录每个点的子树节点数
dis[u][0] = -1 # 1改成-1,以便都从小到大排序
vis[u] = 1
for v in G[u]:
if vis[v] == 0:
dfs(v)
dis[u][0] += dis[v][0]
dfs(root)
dis.sort()
print(dis)
for i, (x, y) in enumerate(dis, 1): # 取出dis的排名,1的意思是索引从1开始
if y == m:
print(i)
break
### BFS
![](https://img-blog.csdnimg.cn/direct/c4ad7dd187a14bb8bff3bac36145db43.png)
按层次分节点(几步能走的点)
![](https://img-blog.csdnimg.cn/direct/0b49a7c1f20545d89f602dec5ff8cfca.png)
不断这样取,直到终点。
#### 蓝桥1509
![](https://img-blog.csdnimg.cn/direct/53c2e36292fb4c68acf88a1de0fb6aac.png)
![](https://img-blog.csdnimg.cn/direct/713beaf680cf41c4970a760097bfb2ff.png)
import os
import sys
请在此输入您的代码
from collections import deque
def bfs(s, t):
s起点, t终点。
dis = [-1] * 100001
queue = deque()
将起点塞入队列中,打上标记。
queue.append(s)
dis[s] = 0
当队列非空
while len(queue) != 0:
# 取出队首元素u
u = queue.popleft()
# 判断u是否为终点
if u == t:
return dis[u]
# 将u相连的所有点v,只要v未标记,则打标记,入队列
for v in [u - 1, u + 1, u * 2]:
# 特判:越界、已标记、障碍物
if 0 <= v <= 100000 and dis[v] == -1:
queue.append(v)
dis[v] = dis[u] + 1
return -1
n, k = map(int, input().split())
print(bfs(n, k))
#### 蓝桥3819
![](https://img-blog.csdnimg