BZOJ2143 飛飛俠 最短路

2021-08-27 11:47:29 字數 1698 閱讀 7765

description

給出兩個 n ∗ m 的矩陣 a,b,以及 3 個人的座標

在 (i, j) 支付 ai,j 的費用可以彈射到曼哈頓距離不超過 bi,j 的位置

問三個人匯合所需要的最小總費用

sample input

4 4

0 0 0 0

1 2 2 0

0 2 2 1

0 0 0 0

5 5 5 5

5 5 5 5

5 5 5 5

5 5 5 5

2 1 3 4 2 2

sample output

z 15

首先考慮做最短路,但太大了,搞不了啊(*&¥%……)

膜了發題解,竟然設三維來dij。心態大崩,什麼時候我連這種東西都忘了

然後就搞了一會兒???

資訊室老爺機跑了14s,ac了,嗯。。。

#include 

#include

#include

#include

using

namespace

std;

int _min(int x, int y)

int _max(int x, int y)

const

int dx[5] = ;

const

int dy[5] = ;

struct node

}; priority_queueq;

int f[160][160][310];

int a[160][160], b[160][160];

int hh[3][160][160];

bool v[160][160][310];

int x[3], y[3];

int main()

for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) scanf("%d", &b[i][j]);

scanf("%d%d%d%d%d%d", &x[0], &y[0], &x[1], &y[1], &x[2], &y[2]);

for(int p = 0; p < 3; p++)

} else

} if(now.k == 0) break;}}

for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) hh[p][i][j] = f[i][j][0];

} int ans = 999999999, k;

if(hh[1][x[0]][y[0]] + hh[2][x[0]][y[0]] < ans) ans = hh[1][x[0]][y[0]] + hh[2][x[0]][y[0]], k = 0;

if(hh[0][x[1]][y[1]] + hh[2][x[1]][y[1]] < ans) ans = hh[0][x[1]][y[1]] + hh[2][x[1]][y[1]], k = 1;

if(hh[0][x[2]][y[2]] + hh[1][x[2]][y[2]] < ans) ans = hh[0][x[2]][y[2]] + hh[1][x[2]][y[2]], k = 2;

if(ans == 999999999)

else

return

0;}

bzoj2143 飛飛俠 最短路

用d i j k 表示走到第 i,j 格,在不彈射的情況下還能再走k步的最小花費,那麼有轉移 d i j k d x y k 1 其中 i,j 和 x,y 相鄰或相等,k 0,表示走到相鄰一格或不走 d i j 0 a i j d x y b i j 表示一次彈射。注意樣例輸入的a,b陣列相反?另外...

bzoj 2143 飛飛俠 最短路

解題思路 這道題點很少,但是邊可能很多,直接建圖做最短路顯然不可行。但是如果把彈射看成獲得了可以走a i j 的能量。這樣就可以直接最短路了。每走一格可看作消耗1的能量,f i j k 表示在i,j這個點且有k的能量的最少費用。每次只要向四個方向走,或者原地不動即可。做三次最短路即可。include...

BZOJ 2143 飛飛俠 最短路

description 飛飛國是乙個傳說中的國度,國家的居民叫做飛飛俠。飛飛國是乙個n m的矩形方陣,每個格仔代表乙個街區。然而飛飛國是沒有交通工具的。飛飛俠完全靠地面的彈射裝置來移動。每個街區都裝有彈射裝置。使用彈射裝置是需要支付一定費用的。而且每個彈射裝置都有自己的彈射能力。我們設第i行第j列的...