刺杀大使--bfs还是比dfs快+二分
1.bfs遍历图,若二分的x可以满足到第n行,true
2.dfs太慢了,不能快速遍历后结束
3.二分答案--最大值最小问题
#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<ll,int> pii;
int n,m;
map<int,int> mp[1005];
bool bo[1010][1010];
int an;
int f;
int w;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
typedef struct di
{
int x,y;
}di;
void bfs(int x,int y)
{
queue<di> q;
q.push({x,y});
bo[x][y]=true;
while(q.size())
{
di t=q.front();
q.pop();
if(t.x==n)
{
f=0;break;
}
for(int i=0;i<4;i++)
{
int tx=t.x+dx[i];
int ty=t.y+dy[i];
if(tx>=1&&tx<=n&&ty<=m&&ty>=1&&!bo[tx][ty]&&mp[tx][ty]<=w)
{
bo[tx][ty]=true;
q.push({tx,ty});
}
}
}
}
bool check(int x)
{
f=1;
w=x;
bfs(1,1);
if(!f) return true;
return false;
}
int main() {
ios::sync_with_stdio(0);
cout.tie(0);
cin.tie(0);
cin>>n>>m;
int ma=0;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>mp[i][j],ma=max(mp[i][j],ma);
int l=0,r=ma;
while(l<=r)
{
int mid=(l+r)>>1;
memset(bo,false,sizeof(bo));
if(check(mid))
{
an=mid;
r=mid-1;
}else l=mid+1;
}
cout<<an;
return 0;
}