一.图论模型
0.分类
无向图:
若图中的每条边都是没有方向的,则称该图为无向图。
有向图:
若图中的每条边都是有方向的,则称该图为有向图。
混合图:
若图中的部分边是有方向的,而部分边是无方向的,则称该图为混合图。
1.Dijkstra
样例1:如下图所示,我们需要从①点走到⑨点,每条边的红色数
字代表这条边的长度,我们如何找到①到⑨的最短路径呢?
代码如下:
def startwith(start: int, mgraph: list) -> list:
passed = [start]
nopass = [x for x in range(len(mgraph)) if x != start]
dis = mgraph[start]
while len(nopass):
idx = nopass[0]
for i in nopass:
if dis[i] < dis[idx]: idx = i
nopass.remove(idx)
passed.append(idx)
for i in nopass:
if dis[idx] + mgraph[idx][i] < dis[i]: dis[i] = dis[idx] + mgraph[idx][i]
return dis
if __name__ == "__main__":
inf = 10086
mgraph = [ [0, 1, inf, 3, inf, inf, inf, inf, inf],
[1, 0, 5, inf, 2, inf, inf, inf, inf],
[inf,inf, 0, 1, inf, 6, inf, inf,inf ],
[inf, inf, inf, 0, inf, 7, inf, 9,inf ],
[inf, 2, 3, inf, 0, 4, 2, inf, 8],
[inf, inf, 6, 7, inf, 0, inf, 2, inf],
[inf, inf, inf, inf, inf, 1, 0, inf, 3],
[inf, inf, inf, inf, inf, inf, 1, 0, 2],
[inf, inf, inf, inf, 8, inf, 3, 2, 0]]
dis = startwith(0, mgraph)
print(dis)
结果如下:
2.Floyd
代码如下:
import numpy as np
inf = 10086
edge = [ [0, 1, inf, 3, inf, inf, inf, inf, inf],
[1, 0, 5, inf, 2, inf, inf, inf, inf],
[inf,inf, 0, 1, inf, 6, inf, inf,inf ],
[inf, inf, inf, 0, inf, 7, inf, 9,inf ],
[inf, 2, 3, inf, 0, 4, 2, inf, 8],
[inf, inf, 6, 7, inf, 0, inf, 2, inf],
[inf, inf, inf, inf, inf, 1, 0, inf, 3],
[inf, inf, inf, inf, inf, inf, 1, 0, 2],
[inf, inf, inf, inf, 8, inf, 3, 2, 0]]
A = edge[:]
N = len(edge)
path = np.zeros((N,N))
def Floyd():
for i in range(N):
for j in range(N):
if edge[i][j] != inf and edge[i][j] != 0:
path[i][j] = i
for a in range(N):
for b in range(N):
for c in range(N):
if(A[b][a]+A[a][c]<A[b][c]):
A[b][c] = A[b][a] + A[a][c]
path[b][c] = path[a][c]
if __name__ == "__main__":
Floyd()
print(path)
结果如下:
3.机场航线设计
数据集来自航空业,有一些关于航线的基本信息。有某段旅程的起始点和目的地。还有一些列表示每段旅程的到达和起飞时间。这个数据集非常适合作为图进行分析。想象一下通过航线(边)连接的几个城市(节点)。如果你是航空公司,你可以问如下几个问题:
(1)从A到B的最短途径是什么?分别从距离和时间角度考虑。
(2)有没有办法从C到D?
(3)哪些机场的交通最繁忙?
(4)哪个机场位于大多数其他机场“之间”?这样它就可以变成当地的一个中转站。
附链接(参考这位大佬):https://blog.csdn.net/zhouzhuo_CSUFT/article/details/81479244