POJ 3613 Floyd 矩陣快速冪

2021-10-12 01:53:56 字數 1561 閱讀 6370

題意

傳送門 poj 3613 cow relays

題解設從 u

uu 出發,到 v

vv 的長度為 k

kk 的最短路徑為 gk[

u][v

]g_k[u][v]

gk​[u]

[v],修改 flo

yd

floyd

floy

d 演算法,則有

g k1

+k2[

u][v

]=

min⁡1≤

w≤v(

gk1[

u][w

]+gk

2[w]

[v])

g_[u][v]=\min\limits_(g_[u][w]+g_[w][v])

gk1​+k

2​​[

u][v

]=1≤

w≤vmin​(

gk1​

​[u]

[w]+

gk2​

​[w]

[v])

用矩陣快速冪求解。初始化矩陣時,g

1g_1

g1​ 為原圖的鄰接矩陣,需要注意的是,按照定義,無自環的情況下 g1[

u][u

]=in

fg_1[u][u]=inf

g1​[u]

[u]=

inf;同理 g0[

u][u

]=

0g_0[u][u]=0

g0​[u]

[u]=

0。複雜度 o(t

3log⁡n

)o(t^3\log n)

o(t3

logn)。

#include

#include

#include

#include

using

namespace std;

#define maxt 105

#define maxv 1005

#define inf 0x3f3f3f3f

typedef vector<

int> vec;

typedef vector mat;

int n, t, s, e, a[maxt]

, b[maxt]

, l[maxt]

, nv, cp[maxv]

;mat mul

(mat &c, mat &d)

mat pow

(mat &m,

int n)

return r;

}int

main()

mat m

(nv,

vec(nv, inf));

for(

int i =

0; i < t;

++i)

m =pow(m, n)

;printf

("%d\n"

, m[cp[s]

][cp[e]])

;return0;

}

POJ 3613 Floyd的思想 矩陣乘法

題目描述抽象來看,是指有乙個有向圖,問乙個點經過n條邊到另乙個點的最短距離 邊可重複走 為了搞這題.去研究了下矩陣乘法.我不是計算機專業 又看了下他們的離散數學教材.有乙個例子是說求兩點間經過n條邊到達的方案數.mtrix67的blog的第八題講的也是這個問題.首先看經過n條邊方案數的這個問題.也就...

POJ3613 Cow Relays 矩陣快速冪

這道題,的確是個一眼題。除了離散化不想說什麼。最開始的時候發現這題的輸入很坑,它給的點的編號不是連續的,也就是說雖然最多只有100個點但點的編號可能會很大,那就只能離散化了,最開始用的去重 二分,調了半天不對,發現這很麻煩,於是換了一種,點的編號沒什麼用,除了當乙個標記之外,不需要維護相對大小,所以...

構造矩陣 矩陣快速冪 POJ3735

這題題意如下,有n 只貓咪,三種關於花生的命令 得花生,吃花生,交換花生 給出一套命令,重複 n 次,問最後每只貓咪得到多少花生。m那麼大,毫無疑問,矩陣快速冪。先構造乙個單位矩陣,因為只需在單位矩陣上進行操作,然後用操作完之後得到的矩陣乘以初始的狀態就得到最終的狀態。看下圖 第 i 只貓咪得花生就...