基於Dijsktra演算法的最短路徑求解

2022-06-28 07:54:10 字數 1618 閱讀 2583

基於dijsktra演算法的最短路徑求解

描述一張地圖包括n個城市,假設城市間有m條路徑(有向圖),每條路徑的長度已知。給定地圖的乙個起點城市和終點城市,利用dijsktra演算法求出起點到終點之間的最短路徑。

輸入多組資料,每組資料有m+3行。第一行為兩個整數n和m,分別代表城市個數n和路徑條數m。第二行有n個字元,代表每個城市的名字。第三行到第m+2行每行有兩個字元a和b和乙個整數d,代表從城市a到城市b有一條距離為d的路。最後一行為兩個字元,代表待求最短路徑的城市起點和終點。當n和m都等於0時,輸入結束。

輸出每組資料輸出兩行。第一行為乙個整數,為從起點到終點之間最短路的長度。第二行為一串字串,代表該路徑。每兩個字元之間用空格隔開。

輸入樣例 1 

3 3

a b c

a b 1

b c 1

a c 3

a c6 8

a b c d e f

a f 100

a e 30

a c 10

b c 5

c d 50

e d 20

e f 60

d f 10

a f0 0

輸出樣例 1

2

a b c

60a e d f

#include#include

#include

#define maxint 32767

#define mvnum 100//

最大頂點數

/*注意是有向圖,用鄰接矩陣

*/int d[mvnum];//

起點開始到各個點的距離

int s[mvnum];//

是否訪問過

intpath[mvnum];

using

namespace

std;

typedef

struct

amgraph;

int locate(amgraph &g,char s)//

返回編號

}void creat(amgraph &g)

for(int i=0;i<=g.arcnum;i++)

for (int j = 0; j <= g.arcnum; j++)

for (int i = 0; i < g.arcnum; i++)

}void dijkstra(amgraph &g,int

v0)

s[v0] = 1

; d[v0] = 0

;

for (int i = 0; i < n - 1; i++)

}s[v] = 1

;

for (int w = 1; w <= n; w++)}}

}void print(amgraph &g,int s,int

e)

for (int j = i - 1; j > 0; j--)

cout

<< g.vexs[r[j]] << "";

cout

<< g.vexs[r[0]] <}int

main()

return0;

}

基於Dijsktra演算法的最短路徑求解

描述 一張地圖包括 n個城市,假設城市間有 m條路徑 有向圖 每條路徑的長度已知。給定地圖的乙個起點城市和終點城市,利用 dijsktra 演算法求出起點到終點之間的最短路徑。輸入多組資料,每組資料有m 3行。第一行為兩個整數n和m,分別代表城市個數n和路徑條數m。第二行有n個字元,代表每個城市的名...

複習之路 最短路演算法Dijsktra

dijkstra spfa floyd dijkstra演算法是一種單源最短路演算法,適用於無負權的圖。其採用了bfs 貪心的方式來更新最短路。初始化dis 每乙個點 dis 起點 0。標記起點,加入集合s。其他點不標記,加入集合u。從集合u中選取與當前點a距離最近的點b。若起點到點a的距離 點a到...

最短路徑(Dijsktra演算法 Floyd演算法)

1 最短路徑 兩個結點之間,帶權路徑長度最短的路徑。常用演算法是dijkstra演算法和floyd演算法,區別在於dijsktra演算法每次只能算出某乙個結點到其他結點的最短路徑,而floyd演算法可以直接把圖中任意兩個結點的最短路徑都算出來。最短路徑一定是簡單路徑。2 dijkstra 迪傑斯特拉...