比赛 练习12 评测结果 AAAAAAAAAA
题目名称 引水入城 最终得分 100
用户昵称 hee 运行时间 0.092 s
代码语言 C++ 内存使用 1.52 MiB
提交时间 2017-06-29 23:21:36
显示代码纯文本
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
#include<map>
#include<set>
#define MAXX 501
using namespace std;
queue<int>x,y;
int f[MAXX];
bool vis[MAXX][MAXX];
int mapp[MAXX][MAXX],n,m,ans;
int dx[5]={0,0,1,-1,0};
int dy[5]={0,1,0,0,-1};
struct segment{
  int l,r;
}s[MAXX];
bool comp(const segment & a,const segment & b){return a.l<b.l;}
void bfs(){
  for(int i=1;i<=m;++i)x.push(1),y.push(i),vis[1][i]=true;
  while(!x.empty()){
    int xx=x.front(),yy=y.front();
    for(int i=1;i<=4;++i){
      int zx=xx+dx[i],zy=yy+dy[i];
      if(zx<1||zx>n||zy<1||zy>m||vis[zx][zy]||mapp[zx][zy]>=mapp[xx][yy])continue;
      vis[zx][zy]=true;
      x.push(zx),y.push(zy);
    }
    x.pop(),y.pop();
  }
}
void dfs(int x,int y,int num){
  if(x==n){s[num].l=min(s[num].l,y);s[num].r=max(s[num].r,y);}
  for(int i=1;i<=4;++i){
      int zx=x+dx[i],zy=y+dy[i];
      if(zx<1||zx>n||zy<1||zy>m||vis[zx][zy]||mapp[zx][zy]>=mapp[x][y])continue;
      vis[zx][zy]=true;
      dfs(zx,zy,num);
    }
}
int main(){
	freopen("flow.in","r",stdin);
	freopen("flow.out","w",stdout);
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;++i)
    for(int j=1;j<=m;++j)scanf("%d",&mapp[i][j]);
  bfs();for(int j=1;j<=m;++j)if(!vis[n][j])ans++;
  if(ans){
    printf("0\n%d",ans);
    return 0;
  }
  for(int i=1;i<=m;++i){
    memset(vis,false,sizeof(vis));
    s[i].l=m+1,s[i].r=0;dfs(1,i,i);
  }
  f[0]=0;
  sort(s+1,s+m+1,comp);
  for(int i=1;i<=m;++i){
    f[i]=MAXX*MAXX*MAXX;
    for(int j=1;j<=m;++j)
      if(s[j].l<=i){
	if(s[j].r>=i)
	f[i]=min(f[i],f[s[j].l-1]+1);
       }
      else continue;
  }
  printf("1\n%d",f[m]);
  return 0;
}