2143 飛飛俠 最短路

2021-08-13 14:52:57 字數 1205 閱讀 4688

description

飛飛國是乙個傳說中的國度,國家的居民叫做飛飛俠。飛飛國是乙個n×m的矩形方陣,每個格仔代表乙個街區。然而飛飛國是沒有交通工具的。飛飛俠完全靠地面的彈射裝置來移動。每個街區都裝有彈射裝置。使用彈射裝置是需要支付一定費用的。而且每個彈射裝置都有自己的彈射能力。我們設第i行第j列的彈射裝置有aij的費用和bij的彈射能力。並規定有相鄰邊的格仔間距離是1。那麼,任何飛飛俠都只需要在(i,j)支付aij的費用就可以任意選擇彈到距離不超過bij的位置了。如下圖 (從紅色街區交費以後可以跳到周圍的任意藍色街區。) 現在的問題很簡單。有三個飛飛俠,分別叫做x,y,z。現在它們決定聚在一起玩,於是想往其中一人的位置集合。告訴你3個飛飛俠的座標,求往**集合大家需要花的費用總和最低。

直接最短路的話邊數巨大,考慮轉變狀態表示f[

i][j

][k]

表示到達(i

,j) 還能免費走

k 次的最小花費,直接轉移即可,複雜度o(

n3lo

gn3)

#include

using

namespace

std;

#define ll long long

#define pa pair

const

int maxn=155;

const ll inf=4557430888798830399ll;

int read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return x*f;

}bool vis[maxn][maxn][maxn<<1];

int a[maxn][maxn],n,m;

ll b[maxn][maxn];

struct pp[4];

struct s;

bool

operator

< (s a,s b)

int tx=;

int ty=;

void dijkstra(int x,int y)}}

if(f[x][y][k]1])f[x][y][k-1]=f[x][y][k],tmp.k--,q.push(make_pair(f[x][y][k],tmp));

}if(f[x][y][k]+b[x][y]int main()

}

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