tu.txt (教程p171 圖6.22)
6 8
a b c d e f
a f 100
a c 10
a e 30
b c 5
c d 50
e d 20
e f 60
d f 10
dijkstra.cpp
#include #include using namespace std;
#define error 0
#define maxint 32767 //表示極大值,即∞
#define mvnum 10 //最大頂點數
typedef char vertextype; //假設頂點的資料型別為字元型
typedef int arctype; //假設邊的權值型別為整型
int *d = new int[mvnum]; //用於記錄最短路的長度
bool *s = new bool[mvnum]{}; //標記頂點是否進入s集合
int *path = new int[mvnum]; //用於記錄最短路頂點的前驅
//------------圖的鄰接矩陣-----------------
struct amgraph
;int locatevex(amgraph &g, vertextype v)
//locatevex
// 採用鄰接矩陣表示法,建立無向網g
void createudn(amgraph &g)
file >> g.vexnum >> g.arcnum; //輸入總頂點數,總邊數
for (i = 0; i < g.vexnum; ++i)
file >> g.vexs[i];
// 初始化鄰接矩陣,邊的權值均置為極大值maxint
for (i = 0; i < g.vexnum; ++i)
for (j = 0; j < g.vexnum; ++j)
g.arcs[i][j] = maxint;
// 構造鄰接矩陣
for (k = 0; k < g.arcnum; ++k)
file.close();
}// 用dijkstra演算法求有向網g的v0頂點到其餘頂點的最短路徑
void shortestpath_dij(amgraph &g, int start)
s[start] = true; //將v0加入s
d[start] = 0; //源點到源點的距離為0
/*―初始化結束,開始主迴圈,每次求得v0到某個頂點v的最短路徑,將v加到s集―*/
for (int i = 0; i < g.vexnum; ++i)
}s[min_index] = true; //將v加入s
for (int k = 0; k < g.vexnum; ++k) //更新從v0出發到集合v?s上所有頂點的最短路徑長度
//if
} } //for
} //shortestpath_dij
// 顯示最短路徑
void displaypath(amgraph &g, int begin, int temp)
}// 顯示圖的鄰接矩陣
dijkstra.py (python版)
from math import inf as m
nodes = ['v0', 'v1', 'v2', 'v3', 'v4']
nodes_num = len(nodes)
graph = [
[0, 10, m, m, 5],
[m, 0, 1, m, 2],
[m, m, 0, 4, m],
[7, m, 6, 0, m],
[m, 3, 9, 2, 0]
]# 初始化
visited = [false] * nodes_num
distance = [m] * nodes_num
path = [-1] * nodes_num
start = 2
visited[start] = true
for i in range(nodes_num):
distance[i] = graph[start][i]
if i != start and distance[i] != m: # start的鄰接結點的path為start
path[i] = start
# 迪傑斯特拉
while not all(visited): # 如果沒有全部訪問完成
# 選擇乙個沒有訪問過且路徑最短的結點
choice_vex = -1
tmp_dist = m
for i in range(nodes_num):
if visited[i]: # 訪問過的不管
continue
if distance[i] < tmp_dist: # 記錄距離更小結點的下標
tmp_dist = distance[i]
choice_vex = i
# 得到了沒有訪問過且路徑最短的結點, 開始處理它
visited[choice_vex] = true
# 更新與其相鄰的未訪問過的結點的distance
for adjvex in range(nodes_num):
# 訪問過的結點, 不相鄰的結點不管
if visited[adjvex]:
continue
if graph[choice_vex][adjvex] == m:
continue
new_dist = distance[choice_vex] + graph[choice_vex][adjvex]
if new_dist < distance[adjvex]: # 如果距離更短,更新鄰接點的資訊
distance[adjvex] = new_dist
path[adjvex] = choice_vex
# 輸出路徑
for i in range(nodes_num):
if i == start:
continue
print(f" -> 最短距離: , 路線: ", end='')
stack =
parent_vex = path[i]
while parent_vex != -1:
parent_vex = path[parent_vex]
route = [nodes[i] for i in reversed(stack)]
print(' -> '.join(route))
floyd.py (弗洛伊德演算法)
from math import inf as m
nodes = ['v0', 'v1', 'v2', 'v3', 'v4']
nodes_num = len(nodes)
a = [
[0, m, 1, m, 10],
[m, 0, m, 1, 5],
[m, 1, 0, m, 7],
[m, m, m, 0, 1],
[m, m, m, m, 0]
]path = [[-1] * nodes_num for i in range(nodes_num)]
# floyd
for k in range(nodes_num): # k 為中轉結點
# 遍歷整個矩陣, i 為行號, j為列號
for i in range(nodes_num):
for j in range(nodes_num):
dist = a[i][k] + a[k][j]
if dist < a[i][j]:
a[i][j] = dist
path[i][j] = k
result =
def get_path(start, end):
k = path[start][end]
if k == -1:
if start not in result:
if end not in result:
else:
get_path(start, k)
get_path(k, end)
get_path(2, 4)
print(" -> ".join(nodes[i] for i in result))
Codeup最短路徑 最短路徑
n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...
Codeup最短路徑 最短路徑問題
給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...
最短路徑之最短路徑問題
提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...