給定乙個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行,...