題目入口
題意:給定乙個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
輸出樣例:
3思路:
原理:和dijkstra的原理有些相似。
用bellman-ford判斷負環:
**實現:o(nm)
#
include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define
lowbit
(x)(x &
(-x))#
define
me(ar)
memset
(ar,0,
sizeof ar)
#define
mem(ar,num)
memset
(ar, num,
sizeof ar)
#define
rp(i, n)
for(
int i =
0, i < n; i ++)#
define
rep(i, a, n)
for(
int i = a; i <= n; i ++)#
define
pre(i, n, a)
for(
int i = n; i >= a; i --)#
define
iosios::
sync_with_stdio(0
); cin.
tie(0)
;cout.
tie(0)
;const
int way[4]
[2]=
,,,}
;using
namespace std;
typedef
long
long ll;
typedef pair pll;
const
int inf =
0x3f3f3f3f3f3f3f3f
;const
double pi =
acos(-
1.0)
;const
double exp =
1e-8
;const ll mod =
1e9+7;
const
int n =
505, m =
1e5+5;
int n, m, k;
int dist[n]
, backup[n]
;struct
node
edges[m]
;int
bellman_ford()
}//可能存在負權邊,所以距離可能不再等於0x3f了
if(dist[n]
>
0x3f3f3f3f/2
)return-1
;return dist[n];}
signed
main()
;}int ans =
bellman_ford()
;if(ans ==-1
)puts
("impossible");
else cout << ans << endl;
return0;
}
bellman ford 有邊數限制的最短路
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出從1號點到n號點的最多經過k條邊的最短距離,如果無法從1號點走到n號點,輸出impossible。給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出從1號點到n號點的最多經過k條邊的最短距離,如...
有邊數限制的最短路(bellman ford演算法)
題目鏈結 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出從1號點到n號點的最多經過k條邊的最短距離,如果無法從1號點走到n號點,輸出impossible。注意 圖中可能 存在負權迴路 輸入格式 第一行包含三個整數n,m,k。接下來m行,每行包含三個整數x,y,z,表示...
Bellman ford 有邊數限制的最短路
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你求出從1號點到n號點的最多經過k條邊的最短距離,如果無法從1號點走到n號點,輸出impossible。注意 圖中可能 存在負權迴路 include using namespace std const int n 505,m 1...