bzoj2143 飛飛俠 最短路

2021-07-10 07:12:37 字數 1002 閱讀 9776

用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陣列相反?另外聽說卡spfa?

ac**如下:

#include#include#include#include#include#define n 155

#define inf 1000000000

using namespace std;

const int dx[4]=,dy[4]=;

int m,n,len,x1,x2,x3,y1,y2,y3,t1,t2,t3,a[n][n],b[n][n],d[n][n][n<<1];

bool vis[n][n][n<<1];

struct node;

priority_queueq;

bool operator <(node u,node v)

void solve(int sx,int sy)

d[sx][sy][0]=0;

node u,v; u.x=sx; u.y=sy; u.z=u.d=0; q.push(u);

while (!q.empty() && !(vis[x1][y1][0] && vis[x2][y2][0] && vis[x3][y3][0])){

u=q.top(); q.pop();

if (vis[u.x][u.y][u.z]) continue; vis[u.x][u.y][u.z]=1;

if (u.z){

for (k=0; k<4; k++){

i=u.x+dx[k]; j=u.y+dy[k];

if (i>0 && i<=m && j>0 && j<=n && u.d

by lych

2016.3.4

bzoj 2143 飛飛俠 最短路

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

BZOJ 2143 飛飛俠 最短路

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

BZOJ2143 飛飛俠 最短路

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...