旅途
题目:
这一题是典型的BFS模板题只有几点需要注意:
1.要靠小根堆顶替栈这样才能最优
2.要想到BFS,乍一看给人DFS的感觉但DFS会超,所以用BFS
3.因为这里有x,y值,所以要开struct 小根堆+结构体?总结如下:
struct point{ int x,y,a; }; struct cmp1{ int operator() (point x,point y) const { return x.a>y.a; } }; priority_queue<point,vector<point>,cmp1> q;
4.最后要注意什么初始化之类的。
当然了,因为老师是照-J难度出的所以也可以不用小根堆
再看看题目:
使最大值最小,使最小值最大是二分的代表所以也可以用二分来解,也算是正解。
就浅说一下二分的思路吧:
总体:二分答案 + 搜索。
先二分路径上的最大值,然后再从 (1, 1) 开始搜索,只走小于等于该二分值的
点,然后判断能否走到 (n, m) 即可。
程序:
#include<bits/stdc++.h> using namespace std; const int N=530; int n,m,a[N][N]={0},vis[N][N]={0},d[10][10]={{1,0},{0,1},{-1,0},{0,-1}},b[N][N]={0},ans=0; struct point{ int x,y,a; }; struct cmp1{ int operator() (point x,point y) const { return x.a>y.a; } }; priority_queue<point,vector<point>,cmp1> q; void bfs() { while(q.size()) { point op=q.top(); ans=max(ans,a[op.x][op.y]); q.pop(); if(op.x==n&&op.y==m) { return; } for(int i=0;i<4;i++) { point np; np.x=op.x+d[i][0]; np.y=op.y+d[i][1]; np.a=a[np.x][np.y]; if(np.x<=n&&np.x>=1&&np.y>=1&&np.y<=m&&vis[np.x][np.y]==0) { vis[np.x][np.y]=1; // a[np.x][np.y]+=a[op.x][op.y]; q.push(np); } } // cout<<"a: "<<op.a<<" x: "<<op.x<<" y: "<<op.y<<endl; } } int main() { freopen( "travel.in", "r", stdin ); freopen( "travel.out", "w", stdout ); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&a[i][j]); b[i][j]=a[i][j]; } } vis[1][1]=1; point t; t.x=1; t.y=1; t.a=a[1][1]; ans=a[1][1]; q.push(t); bfs(); // cout<<a[n][m]; // for(int i=1;i<=n;i++) // { // for(int j=1;j<=m;j++) cout<<a[i][j]<<" "; // cout<<endl; // } cout<<ans; return 0; }