9 最短路徑

2022-07-11 11:15:13 字數 4523 閱讀 2526

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行,...