初識最短路

2021-09-17 02:17:58 字數 1609 閱讀 8807

原則:不斷地用別的點的權值來更新頂點i。

記從起點s出發到頂點i的最短距離是d[i]。

d[i] = min

重複2nd操作來更新d;經過有限次的操作,結束之後的d就是最短距離。

void dijkstra(int s) 

}if (v == -1)

for (int u = 0; u < v; u++)

}}

原則:已標號的點為集合v,未標號的為v的補集;另集合d(p,q)表示兩點之間的最短距離。

源點s上標號為0。(表示d(s, s) = 0

從s直接相鄰(不需要經過第三點即可到達)的所有中挑出最近的點,標上距離,並將這些點放入集合v。

從集合v裡的點直接相鄰的cuv中挑出距離源點s最近的點標上距離,並將這些點放入集合v。

重複3nd操作,直到v為全集。

int cost[max_v][max_v]; // cost[u][v]表示邊e=(u,v)的權值(不存在這條邊時設為inf)

int d[max_v]; // 頂點s出發的最短距離

bool used[max_v]; // 已經使用過的圖

int v; // 頂點數

// 求從起點s出發到各個頂點的最短距離

void dijkstra(int s)

}if (v == -1)

for (int u = 0; u < v; u++)

}}

可用「堆」進行優化
// 用堆進行優化

struct edge ;

typedef pairp;

int v;

vectorg[max_v];

int d[max_v];

void dijkstra(int s)

for (int i = 0; i < g[v].size(); i++) }}

}

原則:貪心(對每一步進行貪心處理)

用n*n的矩陣表示出兩點之間的直接距離(從行序號到列序號)。(ps:若兩點之間無法直接到達,則用∞/inf來表示)

若要得到出更短的距離,只有在兩點之間用第三點來作為中介。

例如,a、b兩點之間存在第三點k,若ak + kb < ab,則用k點更新ab兩點之間的距離。

重複3nd操作,直到任意兩點之間沒有第三點可以加入。

void warshall-floyd()
適用:可用於存在負權的最短路計算

動態逼近法(逐步找出最短路)

設定乙個先進先出的佇列(fifo)。

把佇列中第乙個的臨近點做鬆弛操作。

若佇列中不存在此點,則將此點放入隊尾。

刪除隊首點。

重複2nd~4th操作,直到隊列為空。

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路徑演算法 最短路

在每年的校賽裡,所有進入決賽的同學都會獲得一件很漂亮的t shirt。但是每當我們的工作人員把上百件的衣服從商店運回到賽場的時候,卻是非常累的!所以現在他們想要尋找最短的從商店到賽場的路線,你可以幫助他們嗎?input 輸入包括多組資料。每組資料第一行是兩個整數n m n 100,m 10000 n...

最短路(最短路之積)

首先考慮暴力維護,顯然極端資料就會炸裂,那麼用什麼來維護呢?考慮乙個很 nb的公式log n m log n log m ok,這道題到此結束 我們只要把乘積轉化為對數,最後再還原就可以了,也不用考慮精度問題,本蒟蒻試著用pow,然後它死了。includeusing namespace std co...