Floyd求最短路

2021-10-06 08:29:41 字數 2281 閱讀 6450

傳送門

題意:給定乙個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 ...