BZOJ 2143 飛飛俠 最短路

2021-08-10 02:48:17 字數 2770 閱讀 1907

description

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

input

輸入的第一行包含兩個整數n和m,分別表示行數和列數。接下來是2個n×m的自然數矩陣,為aij和bij 最後一行六個數,分別代表x,y,z所在地的行號和列號。

output

第一行輸出乙個字元x、y或者z。表示最優集合地點。第二行輸出乙個整數,表示最小費用。如果無法集合,只輸出一行no

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強行建邊跑最短路,但算了算空間,發現要re,於是開始醚了,既然建邊不行那就不建邊吧,嗯,有道理。於是想剛一波廣搜加上各種剪枝水過,結果廣搜寫著寫著。。。就寫成了spfa!於是懶得改了,過了樣例就氣療,打算拿20分走人,也沒剪枝什麼的。然後更醚的是,我跑了40分!於是我看了看單點結果,發現前面有3個點是wa了,而後面竟然跑過了第14個點,於是想不通啊,難道我tle不是太慘?於是在bzoj交了一發,發現竟然wa,沒有tle,後來在o2下跑,跑了70分,於是信心大增,加上剪枝各種register,然後跑了85分,只剩那很醚的3個點wa掉了,現在還沒有調過。。說了這麼半天其實,我想說的是這道題,不用建邊,暴力跑dijorspfa加上各種剪枝是能過的!至於那些什麼雲端什麼的,知道就好了,反正用處我覺得不是太大。(這麼說是不是太*****了);

附上我的蒟蒻醚**

# include 

# include

# include

# include

# include

# include

# include

# include

# include

using

namespace

std;

typedef

long

long ll;

int read()

while(ch>='0'&&ch<='9')

return f*i;

}int buf[1024];

inline

void write(long

long x)

if(x<0)

while(x)

while(buf[0]) putchar(buf[buf[0]--]+48);

return ;

}const

int n=205;

struct data

data(int x,int y) : x(x),y(y){}

}s[5];

int n,m,a[n][n],b[n][n],f[n][n][4];

bool vis[n][n];

inline

void bfs(int t)}}

}inline

void printf(int ans,int tmp)

if(tmp==2)

if(tmp==3)

}int main()

}printf(ans,tmp);

}

這裡是dalao**:

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

int getint()

const

int n=205;

const

int fx[5]=;

const

int fy[5]=;

const ll inf=0x3f3f3f3f3f3f3f3f;

int n,m,h,x[4],y[4];

int a[n][n],b[n][n];

ll dis[n][n][n<<1],d[4][4];

struct node

};priority_queuevector

,greater>q;

void dijkstra(int s,int t1,int t2)

); while(!q.empty()));}

}}

else);}

}}

}int main()

當然還有dalao用什麼線段樹,set維護建邊,然後玄學跑過的這種,還是自己去研究吧。

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

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