目錄演算法求解
參考文章
題目傳送門
給定乙個 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...