记录编号 192230 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010]引水入城 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 C++ 运行时间 0.254 s
提交时间 2015-10-10 07:18:05 内存使用 5.34 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdlib>
 
using namespace std;
 
const int MAXN = 505;
const int gx[4]= {-1,0,1,0};
const int gy[4]= {0,1,0,-1};
 
int ans=0x3fffffff;
int n,m,cs,tot;
bool flag;
int f[MAXN];
int map[MAXN][MAXN];
bool vis[MAXN][MAXN];
int num[MAXN][MAXN];
 
struct at {
    int l,r,id;
} a[MAXN];
 
void bfs_judge() {
    queue< pair<int,int> > q;
    for(int i=1; i<=m; ++i)q.push(make_pair(1,i)),vis[1][i]=1;
    while(!q.empty()) {
        int ex=q.front().first;
        int ey=q.front().second;
        q.pop();
        for(int i=0; i<4; ++i) {
            int qx=ex+gx[i];
            int qy=ey+gy[i];
            if(qx<1||qy<1||qx>n||qy>m||vis[qx][qy]||map[ex][ey]<=map[qx][qy]) continue;
            vis[qx][qy]=1;
            q.push(make_pair(qx,qy));
        }
    }
    for(int i=1; i<=m; ++i)
        if(!vis[n][i]) {
            flag=1;
            tot++;
        }
    if(flag) {
        printf("0\n%d",tot);
        exit(0);
    }
}
 
void bfs(int x,int y) {
    memset(vis,0,sizeof(vis));
    queue < pair<int,int> > q;
    q.push(make_pair(x,y));
    vis[x][y]=1;
    a[num[x][y]].id=num[x][y];
    while(!q.empty()) {
        int ex=q.front().first;
        int ey=q.front().second;
        q.pop();
        for(int i=0; i<4; ++i) {
            int qx=ex+gx[i];
            int qy=ey+gy[i];
            if(qx<1||qy<1||qx>n||qy>m||vis[qx][qy]||map[ex][ey]<=map[qx][qy]) continue;
            vis[qx][qy]=1;
            q.push(make_pair(qx,qy));
        }
    }
    for(int i=1; i<=m; ++i)
        if(vis[n][i]) {
            a[num[x][y]].l=i;
            break;
        }
    for(int i=m; i>=1; i--) {
        if(vis[n][i]) {
            a[num[x][y]].r=i;
            break;
        }
    }
}
 
void dp() {
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<=m;++i) {
        if(a[num[1][i]].l==1) {
            f[i]=1;
            continue;
        }
        for(int j=1;j<i;++j) {
            if(a[num[1][j]].r>=a[num[1][i]].l-1) {
                if(f[i]>f[j]+1) {
                    f[i]=f[j]+1;
                }
            }
        }
        if(a[num[1][i]].r==m) {
            ans=min(ans,f[i]);
        }
    }
    printf("1\n%d",ans);
}
 
int main() {
    freopen("flow.in","r",stdin);
    freopen("flow.out","w",stdout);
    int i,j;
    scanf("%d%d",&n,&m);
    for(i=1; i<=n; ++i) for(j=1; j<=m; ++j) num[i][j]=++cs;
    for(i=1; i<=n; ++i)  for(j=1; j<=m; ++j) scanf("%d",&map[i][j]);
    bfs_judge();
    for(i=1; i<=m; ++i) bfs(1,i);
    dp();
//  for(i=1;i<=m;++i) printf("%d %d\n",a[num[1][i]].l,a[num[1][i]].r);
}