傳送門
題意:給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。
再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出「impossible」。
資料保證圖中不存在負權迴路。
輸入格式
第一行包含三個整數n,m,k
接下來m行,每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。
接下來k行,每行包含兩個整數x,y,表示詢問點x到點y的最短距離。
輸出格式
共k行,每行輸出乙個整數,表示詢問的結果,若詢問兩點間不存在路徑,則輸出「impossible」。
資料範圍
1≤n≤200,
1≤k≤n2
1≤m≤20000,
圖中涉及邊長絕對值均不超過10000。
輸入樣例:
3 3 2
1 2 1
2 3 2
1 3 1
2 11 3
輸出樣例:
impossible
1思路: floyd的原理其實很簡單,就是三重1~n的迴圈(從外到內分別是i,j,k),更新時d[i][j] = min(d[i][j],d[i][k] + d[k][j])就好。
**實現:
#
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 =
1e9;
const
double pi =
acos(-
1.0)
;const
double exp =
1e-8
;const ll mod =
1e9+7;
const
int n =
210;
int n, m, q;
int d[n]
[n];
void
floyd()
signed
main()
floyd()
;while
(q --
)return0;
}
Floyd求最短路
路徑矩陣 通過乙個圖的權值矩陣求出它的每兩點間的最短路徑矩陣。從圖的帶權鄰接矩陣a a i,j n n開始,遞迴地進行n次更新,即由矩陣d 0 a,按乙個公式,構造出矩陣d 1 又用同樣地公式由d 1 構造出d 2 最後又用同樣的公式由d n 1 構造出矩陣d n 矩陣d n 的i行j列元素便是i號...
AcWing Floyd求最短路 Floyd
時 空限制 1s 64mb 給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出 impossible 資料保證圖中不存在負權迴路。第一行包含三個整數n,m,k 接下來m行,每行包含三...
Floyd演算法(求最短路)
百科名片 弗洛伊德演算法 floyd演算法又稱為弗洛伊德演算法,插點法,是一種用於尋找給定的加權圖中頂點間最短路徑的演算法。該演算法名稱以創始人之一 1978年圖靈獎獲得者 史丹福大學電腦科學系教授羅伯特 弗洛伊德命名。通過乙個圖的權值矩陣求出它的每兩點間的最短路徑 矩陣。從圖的帶權鄰接矩陣a a ...