图论基础(python蓝桥杯)

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
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值