总觉得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题目的解题思路,作者分享了尝试使用SPFA算法但未能通过的情况,最终采用二分搜索配合验证的方法解决问题。
721

被折叠的 条评论
为什么被折叠?



