看题目想了一会就觉得像最短路··· 于是
#include <bits/stdc++.h>
using namespace std;
#define N 1005
int n,m,a[N][N],d[N][N],vst[N][N];
int fx[4]={0,-1,1,0};
int fy[4]={1,0,0,-1};
struct point{
int x;int y;
point(){}
point(int xx,int yy):x(xx),y(yy){}
};
struct node{
int w;
point p;
node(){}
node(int ww,point pp):w(ww),p(pp){}
};
priority_queue<node> q;
bool operator < (node a,node b)
{
return a.w>b.w;
}
int dj(int stx,int sty)
{
memset(d,0x3f,sizeof(d));
d[1][1]=0;
q.push(node(0,point(stx,sty)));
while(!q.empty())
{
point nw=q.top().p;q.pop();
if(vst[nw.x][nw.y]) continue;
// cout<<nw.x<<" "<<nw.y<<" "<<d[nw.x][nw.y]<<endl;
vst[nw.x][nw.y]=1;
for(int i=0;i<4;i++)
{
int vx=nw.x+fx[i],vy=nw.y+fy[i];
if(vx<=0||vy<=0||vx>n||vy>m) continue;
if(d[vx][vy]>=max(d[nw.x][nw.y],a[vx][vy]))//松弛改成路径最小的最大值
{
d[vx][vy]=max(d[nw.x][nw.y],a[vx][vy]);
q.push(node(d[vx][vy],point(vx,vy)));
}
}
}
return d[n][m];
}
int main()
{
scanf("%d",&n);scanf("%d",&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
cout<<dj(1,1);
return 0;
}
复杂度O(n2logn2),吸氧能过
话说不吸氧有没有可能过,也许手写堆能过?