1. 程式人生 > >HDU 6331 Walking Plan(分塊 動態規劃)

HDU 6331 Walking Plan(分塊 動態規劃)

題意

給一個 n 個節點 m 條邊的有向圖,第 i 條邊的兩個端點為 ui,vi,邊的長度為 wiq 次詢問,每次詢問從節點 st 至少走過 k 條路徑的最小距離。

輸入

第一行包含一個整數 T(1T10),接下去有 T 組資料,每組資料第一行為兩個整數 n,m(2n50,1m104),接下去 m 行每行三個整數 ui,vi,wi(1ui,vin,uivi,1wi104),接著為一個整數

q(1q105),接下去 q 行每行三個整數 si,ti,ki(1si,tin,1k104)

輸出

對於每次詢問,輸出最短路徑長度,如果無法從節點 si 到達 ti,則輸出 1

樣例

輸入
2
3 3
1 2 1
2 3 10
3 1 100
3
1 1 1
1 2 1
1 3 1
2 1
1 2 1
1
2 1 1
輸出
111
1
11
-1

題解

定義 G[i][j] 為從節點 i 恰好經過 1 步到達節點 j 的最短距離(即原圖按輸入取最小值),無法到達設為

dis[k][i][j] 表示從 i 點出發恰好經過 k 步到達 j 點的最短路徑,則有遞推式:

dis[0][i][j]={0i=jijdis[k][i][j]=min(dis[k1][i][u]+G[u][j]),u[1,n],k0定義 A[x][i][j] 表示從