單源最短路徑 Dijkstra演算法

2021-07-24 15:01:58 字數 1165 閱讀 6849

題目:

problem description

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。

input

輸入n,m,點的編號是1~n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t;起點s,終點。n和m為0時輸入結束。(1

output

輸出 一行有兩個數, 最短距離及其花費。

sample input

3 2

1 2 5 6

2 3 4 5

1 30 0

sample output

9 11

#includeusing namespace std;

#define finity 0x7fffffff

int d[1002][1002]; //長度

int p[1002][1002]; //花費

bool b[1002]; //標記是否已加入

int n,m;

int pv0[1002];

int dv0[1002];

void dijkstra(int v0)

}if(mind == finity)

return;

b[k] = true;

//由於k的加入 更新d[v0]

for(int i = 0;imind + d[k][i])

else if(dv0[i] == mind + d[k][i] && pv0[i] >minp + p[k][i])}}

}}int main()

{ int s,t;

while((cin>>n>>m) && (n||m))

{//初始化

for(int i = 0;i>ta>>tb>>td>>tp; //這裡用cin會超時,大量資料應用scanf輸入

scanf("%d%d%d%d",&ta,&tb,&td,&tp);

ta = ta -1;

tb = tb -1;

if(td>s>>t;

dijkstra(s-1);

cout<

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra單源最短路徑

dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...