最短路徑(二)Bellman Ford(負權)

2021-10-09 20:29:18 字數 1606 閱讀 4550

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

請你求出從1號點到n號點的最多經過k條邊的最短距離,如果無法從1號點走到n號點,輸出impossible。

注意:圖中可能 存在負權迴路 。

輸入格式

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

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

輸出格式

輸出乙個整數,表示從1號點到n號點的最多經過k條邊的最短距離。

如果不存在滿足條件的路徑,則輸出「impossible」。

資料範圍

1≤n,k≤500,

1≤m≤10000,

任意邊長的絕對值不超過10000。

輸入樣例:

3 3 1

1 2 1

2 3 1

1 3 3

輸出樣例:

3bellman_ford演算法思路:

第一步:初始化所有的點,每個點儲存原點距該點的距離

第二步:迴圈遍歷所有的邊,進行鬆弛計算dist[u.b] = min(dist[u.b], last[u.a] + u.c);

第三步:遍歷途中所有的邊edge(u, v),判斷是否d(v) > d(u) + w(u,v),若是則返回false,表示途中存在從源點可達的權為負的迴路。

本題迭代k次,求出從源點即一號點經過不超過k條邊,走到每個點的最短距離。

注意:輸出-1的判斷條件不是dist[n] == 0x3f3f3f3f.而是dist[n] > 0x3f3f3f3f / 2.

這是因為bellman_ford演算法裡的資料可能存在負權邊。在乙個存在負權的環裡,dist的值會不斷的減小,但是由於m, k是有限的,dist也不會減太多,最多減500萬次,因此dist[n]的值可能就不是設定的0x3f3f3f3f.

code:

#include

#include

#include

using

namespace std;

const

int n =

510, m =

10010

;int n, m, k;

int dist[n]

, last[n]

;struct edge

edges[m]

;int

bellman_ford()

}if(dist[n]

>

0x3f3f3f3f/2

)return-1

;return dist[n];}

intmain()

;}int t =

bellman_ford()

;if(t ==-1

) cout <<

"impossible"

<< endl;

else cout << t << endl;

return0;

}

Codeup最短路徑 最短路徑

n個城市,標號從0到n 1,m條道路,第k條道路 k從0開始 的長度為2 k,求編號為0的城市到其他城市的最短距離。第一行兩個正整數n 2 n 100 m m 500 表示有n個城市,m條道路,接下來m行兩個整數,表示相連的兩個城市的編號。n 1行,表示0號城市到其他城市的最短路,如果無法到達,輸出...

Codeup最短路徑 最短路徑問題

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一行是兩個數 s,t 起點s,...

最短路徑之最短路徑問題

提交 狀態 討論版 命題人 外部匯入 題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點間的直線距離。現在的 任務是找出從一點到另一點之間的最短路徑。輸入共n m 3行,...