【专题】图论
1、蓝桥王国(Dijstra算法模板题)
Dijstra算法:从一个节点到达其他所有节点的最短路径【一对多】。
蓝桥王国有N个建筑和M条单向通道,每条通道都连接两个建筑,每个建筑都有自己的编号,分别为1~N(其中皇宫编号为1)。国王想让小明回答从皇宫到每个建筑的最短路径是多少。
输入描述:
第一行输入n,m。
第2到M+1行每行有三个正整数u,v,w。表示 u -> v 之间存在一条距离为w的路
输出描述:
输出一行,共N个数,分别表示从皇宫到编号为1~N建筑的最短距离
import heapq # 导入堆
def dij(s):
done = [0 for i in range(n + 1)] # 记录是否处理过
hp = [] # 堆
dis[s] = 0
heapq.heappush(hp, (0, s)) # 入堆,小顶堆
while hp:
u = heapq.heappop(hp)[1] # 出堆元素结点
if done[u]: # 当前结点处理过
continue
done[u] = 1
for i in range(len(G[u])): # 遍历当前结点的邻居
v, w = G[u][i]
if done[v]: continue
dis[v] = min(dis[v], dis[u] + w) # 更新当前结点邻居的最短路径
heapq.heappush(hp, (dis[v], v))
n, m = map(int, input().split())
s = 1 # 从1开始访问
G = [[] for i in range(n + 1)] # 邻接表存储
inf = 2 ** 50
dis = [inf] * (n + 1) # 存储距离
for i in range(m): # 存边,这里是单向边
u, v, w = map(int, input().split())
G[u].append((v, w)) # 记录结点u的邻居和边长
dij(s)
for i in range(1, n + 1):
if dis[i] == inf:
print("-1", end=' ')
else:
print(dis[i], end=' ')
---------------------------------------------
输入:
3 3
1 2 1
1 3 5
2 3 2
输出:0 1 3
---------------------------------------------
2、蓝桥公园 (Floyd算法模板题)
Floyd算法:所有点对之间的最短路径【多对多】。
小明喜欢观景,于是今天他来到了蓝桥公园。
已知公园有 N 个景点,景点和景点之间一共有 M 条道路。小明有 Q 个观景计划,每个计划包含一个起点 st 和一个终点 ed,表示他想从 st 去到 ed。但是小明的体力有限,对于每个计划他想走最少的路完成,你可以帮帮他吗?
输入描述:
输入第一行包含三个正整数 N,M,Q
第 2 到 M+1 行每行包含三个正整数 u,v,w,表示 u↔v 之间存在一条距离为 w 的路。
第 M+2 到 M+Q−1 行每行包含两个正整数 st,ed,其含义如题所述。
输出描述:
输出共 QQ 行,对应输入数据中的查询。若无法从 st 到达 ed 则输出 −1。
def floyd():
global dp
for i in range(1, n + 1):
for j in range(1, n + 1):
for k in range(1, n + 1):
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j])
n, m, q = map(int, input().split())
inf = 2 ** 120
dp = [[inf] * (n + 1) for i in range(n + 1)]
choice = []
for i in range(m):
u, v, w = map(int, input().split())
dp[u][v] = w
dp[v][u] = w
for i in range(q):
s, d = map(int, input().split())
choice.append((s, d))
floyd()
for s, d in choice:
if dp[s][d] != inf:
print(dp[s][d])
continue
print(-1)
---------------------------------------------
输入:
3 3 3
1 2 1
1 3 5
2 3 2
1 2
1 3
2 3
输出:
1
3
2
---------------------------------------------