AcWing 854 Floyd求最短路

2022-10-04 02:18:08 字數 1776 閱讀 2870

目錄演算法求解

參考文章

題目傳送門

給定乙個 nn 個點 mm 條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。

再給定 kk 個詢問,每個詢問包含兩個整數 xx 和 yy,表示查詢從點 xx 到點 yy 的最短距離,如果路徑不存在,則輸出impossible

資料保證圖中不存在負權迴路。

輸入格式

第一行包含三個整數 n,m,kn,m,k。

接下來 mm 行,每行包含三個整數 x,y,zx,y,z,表示存在一條從點 xx 到點 yy 的有向邊,邊長為 zz。

接下來 kk 行,每行包含兩個整數 x,yx,y,表示詢問點 xx 到點 yy 的最短距離。

輸出格式

共 kk 行,每行輸出乙個整數,表示詢問的結果,若詢問兩點間不存在路徑,則輸出impossible

資料範圍

1≤n≤2001≤n≤200,

1≤k≤n21≤k≤n2

1≤m≤200001≤m≤20000,

圖中涉及邊長絕對值均不超過 1000010000。

輸入樣例:

3 3 2

1 2 1

2 3 2

1 3 1

2 11 3

輸出樣例:
impossible

1

#include#include#include#includeusing namespace std;

const int n = 210;

const int inf = 0x3f3f3f3f;

// 用鄰接矩陣儲存

int d[n][n];

int n, m, k;

void floyd()

int main()

// while(m--)

floyd();

while(k--)

return 0;

}

\(o(n^3)\)

演算法分析

(y總真言,簡單易懂)

文本性複習

dijkstra-樸素o(n^2)

初始化距離陣列, dist[1] = 0, dist[i] = inf;

for n次迴圈 每次迴圈確定乙個min加入s集合中,n次之後就得出所有的最短距離

將不在s中dist_min的點->t

t->s加入最短路集合

用t更新到其他點的距離

dijkstra-堆優化o(mlogm)

利用鄰接表,優先佇列

在priority_queue[html_removed], greater[html_removed] > heap;中將返回堆頂

利用堆頂來更新其他點,並加入堆中類似寬搜

bellman_fordo(nm)

注意連鎖想象需要備份, struct edge edge[m];

初始化dist, 鬆弛dist[x.b] = min(dist[x.b], backup[x.a]+x.w);

鬆弛k次,每次訪問m條邊

spfa o(n)~o(nm)

利用佇列優化僅加入修改過的地方

for k次

for 所有邊利用寬搜模型去優化bellman_ford演算法

更新佇列中當前點的所有出邊

floyd o(n^3)

AcWing 854 Floyd求最短路

題目描述 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出 impossible 資料保證圖中不存在負權迴路。輸入格式 第一行包含三個整數n,m,k 接下來m行,每行包含三個整數x...

854 Floyd求最短路(不能有負權迴路)

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出 impossible 資料保證圖中不存在負權迴路。輸入格式 第一行包含三個整數n,m,k 接下來m行,每行包含三個整數x,y,z,...

AcWIng344 觀光之旅(floyd求最小環)

求最小環的原理是dp的思想,我們以環中最大的節點作為斷點,這樣在求floyd的過程中,在更新之前,可以用i和k以及j和k相連的兩條線路以及原先i和j在前k 1已經求出的最短路當作環進行比較 因為我們分割出了所有情況。而在求取方案的時候,我們設定乙個pos陣列,表示最短路的分割點,進行遞迴求取 inc...