HDU 2337

来源:互联网 发布:数据分析 主成分分析 编辑:程序博客网 时间:2024/04/29 02:24
二分+bfs:
#include<cstdio>#include<iostream>#include<cstring>#include<vector>#include<set>#include<queue>#include<algorithm>using namespace std;typedef pair<int, int> PII;#define xx first#define yy secondconst int maxn = 1000 + 5;const int dx[] = {-1, 0, 1, 0};const int dy[] = {0, 1, 0, -1};queue<PII> Q;int d[maxn][maxn];int dist[maxn][maxn];int N, X, Y;int sx, sy, ex, ey;int judge(int x, int y){return x >= 1 && x <=  X && y >= 1 && y <=Y; }void bfs(){    while(!Q.empty()){        PII u = Q.front(); Q.pop();        for(int i = 0; i < 4; ++i){            int nx = u.xx + dx[i];            int ny = u.yy + dy[i];            if(judge(nx, ny) && dist[nx][ny] == -1){                dist[nx][ny] = dist[u.xx][u.yy] + 1;                Q.push(PII(nx, ny));            }        }    }}int cal(int x){    while(!Q.empty()) Q.pop();    for(int i = 1; i <= X; ++i)        for(int j = 1; j <= Y; ++j) d[i][j] = - 1;    d[sx][sy] = 0;    Q.push(PII(sx, sy));    while(!Q.empty()){        PII u = Q.front(); Q.pop();        if(u.xx == ex && u.yy == ey) return d[ex][ey];        for(int i = 0; i < 4; ++i){            int nx = u.xx + dx[i];            int ny = u.yy + dy[i];            if(judge(nx, ny) && d[nx][ny] == -1 && dist[nx][ny] >= x){                d[nx][ny] = d[u.xx][u.yy] + 1;                Q.push(PII(nx, ny));            }        }    }    return -1;}int main(){    int T;    scanf("%d", &T);    while(T--){        while(!Q.empty()) Q.pop();        memset(dist,-1,sizeof(dist));        scanf("%d%d%d", &N, &X, &Y);        scanf("%d%d%d%d", &sx, &sy, &ex, &ey);        ++sx, ++sy, ++ex, ++ey;        while(N--){            int x, y;            scanf("%d%d", &x, &y);            ++x, ++y;            dist[x][y] = 0;            Q.push(PII(x, y));        }        bfs();        if(sx == ex && sy == ey){            printf("%d 0\n", dist[sx][sy]);            continue;        }        int x = 0, y = dist[sx][sy] + 1;        while(x<y){            int mid = (x+y)/2;            if(cal(mid) != -1) x = mid + 1;            else y = mid;        }        printf("%d %d\n", x-1, cal(x-1));    }    return 0;}

0 0