hdoj1874 (優先佇列 Dijkstra)

2022-05-29 04:12:08 字數 1486 閱讀 5098

hdoj1874

分析: 

一看題目, 就是求最短路, 這道題用的是dijkstra+優先佇列。先說一下dijkstra演算法:每次擴充套件乙個距離最短的節點, 更新與其相鄰點的距離。 當所有邊權都為正時, 由於不會存在乙個距離更短的沒有擴充套件的點,所以這個點的距離不會在改變, 保證了演算法的正確性。

演算法步驟如下: 

g= 1. 初始時令 s=,t=v-s=,t中頂點對應的距離值 

若存在〈v0,v〉,d(v0,vi)為〈v0,vi〉弧上的權值 

若不存在〈v0,vi〉,d(v0,vi)為∞ 

2. 從t中選取乙個與s中頂點有關聯邊且權值最小的頂點w,加入到s中 

3. 對其餘t中頂點的距離值進行修改:若加進w作中間頂點,從v0到vi的距離值縮短,則修改此距離值 

重複上述步驟2、3,直到s中包含所有頂點,即w=vi為止。

偽**:

將所有節點狀態初始化(標記為未計算) 

設起始點s, d[s] = 0; 其他節點d[i] = max; 

迴圈n次 

對應**:

memset(v, 0, sizeof

(v));

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

d[i] =10e8;

d[s] = 0

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

}

程式的複雜度為n方, 每一次都要求所有d中的最小值。 然而stl中的優先佇列priority_queue正好解決了這一問題。

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

int n, m, s, t, v[1005

];double d[1005

];struct

edge

e[1005

];struct node//

儲存點的資訊, 起始點到x節點的最短距離d.

no[1005

];bool

operator

vector

vec[1005

];double ac(int

x) }

}return -1;}

intmain()

scanf(

"%d%d

", &s, &t);

d[s] = 0

;

double ans =ac(s);

if(ans == -1

) printf(

"-1\n");

else

printf(

"%.0lf\n

", ans);

}return0;

}

view code

hdoj1874 暢通工程續

dijsktra演算法 偽 清除所有標記 d 0 0,其他d i intmax for 1到n dijkstra演算法的應用 include using namespace std const int max 201 const int intmax 10000000 int map max max...

HDOJ 1874 最短路問題

題目大意 輸入n,m,分別表示有編號 0 n 1 n個城鎮和m調街道,接下來輸入m條道路及其所花費的時間,之後輸入起點和終點,最後求出從起點到終點所花費的最短時間。演算法思想 迪傑斯特拉演算法 1.根據輸入資訊建立鄰接矩陣,為無向圖。此處需要注意會有道路覆蓋的問題,此時應用花費時間最小的道路。2.用...

HDOJ1874 暢通工程續

題目鏈結 求單源最短路的題,因為邊權非負,所以可以用dijkstra。這題有一點需要注意的地方是有重邊,在讀資料時取較小的即可。view code 1 include 2 include 3 define min a,b a 4 define n 200 5 define inf 2000000 6...