关键词:单源、O(n**2)、不能处理负边权、蓝点、白点。
## n: 点数
## m: 边数
## q[]: 蓝点
## s: 起点
## dis[v]: 起点s到v的距离
## w[u][v]: u到v的权值,无法到达INF
## vis[]: 记录蓝点还是白点,蓝点为0,白点为1
## 思想:将蓝点中 最短距离的点设为白点,更新此白点相关点的最短路径dis[]。
## 不断循环这个步骤,直到没有蓝点(q[]为空)
## 初始化:dis[s]=0,dis[其他]=INF, w[][], vis[]=0
vis=[0]*(N+1)
dis=[INF]*(N+1)
heapq.heappush(q,(0,1)) ## 将起点1放入,距离为0
while q: ## 一直循环,直到没有蓝点会结束break
v=heapq.heappop(q)[1] ## 取出距离最小的蓝点
if vis[v]==1:
continue
else:
vis[v]=1
for a,b in g[v]: 将当前蓝点相关的所有边进行调整
if vis[a]==1:
continue
else:
dis[a]=min(dis[a]+dis[v]+b)
heapq.heappush(q,(dis[a],a)) ## (w,v)形式存入,自动将距离最短的蓝点放前面