生活随笔
收集整理的這篇文章主要介紹了
[洛谷P1902]刺杀大使
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目←
總覺得spfa一臉可做的樣子然而過不了
于是乖乖打了二分+驗證
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN =
1000 +
50;
int mr[] = {
0,
1,-
1,
0},mu[] = {
1,
0,
0,-
1};
bool used[MAXN][MAXN];
int n,m;
bool in(
int x,
int y){
if(x <
1 || y <
1)
return false;
if(x > n || y > m)
return false;
return true;
}
int lim;
int map[MAXN][MAXN];
struct zt{
int x,y;
};
queue <zt> q;
bool C(){
memset(used,
0,
sizeof(used));
while(!q.empty())q.pop();
for(
int i =
1;i <= m;i ++){q.push((zt){
1,i});used[
1][i] =
true;}
while(!q.empty()){zt u = q.front();q.pop();
for(
int i =
0;i <=
3;i ++){
int x = u.x + mu[i];
int y = u.y + mr[i];
if(x <
1 || y <
1 || x > n || y > m || used[x][y] ||
map[x][y] > lim)
continue;q.push((zt){x,y});used[x][y] =
true;
if(x == n){
return true;}}}
return false;
}
int lin[MAXN*MAXN],tot,maxx,L,R;
int main(){
scanf(
"%d%d",&n,&m);
for(
int i =
1;i <= n;i ++){
for(
int j =
1;j <= m;j ++){
scanf(
"%d",&
map[i][j]);lin[++ tot] =
map[i][j];}}sort(lin +
1,lin + tot +
1);tot = unique(lin +
1,lin + tot +
1) - lin -
1;L = -
1;R = tot +
1;
while(R - L >
1){
int mid = R + L >>
1;lim = lin[mid];
if(C())R = mid;
else L = mid;}
printf(
"%d",lin[R]);
}
總結
以上是生活随笔為你收集整理的[洛谷P1902]刺杀大使的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。