POJ 3057-Evacuation

分析

这个题想了半天。
最开始想的是不断地BFS,但这样不仅时间复杂度没有保障,而且正确性可能也有问题。
如果门是固定的,还可以考虑像曾经一个题那么做,但现在不行了,因为门不仅不固定,而且还有很多个。
但有一个性质可以考虑,就是每扇门在某一时刻只能走出一个人。
不难想到二分图匹配。

#include
#include
#include
#include
#include
using namespace std;
const int N=15,M=1e5+10;
struct Node{
    int x,y;
    Node(){}
    Node(int a,int b){
        x=a;y=b;
    }
};
struct Edge{
    int to,nxt;
}e[M*100];
int h[10*M],idx;
void Ins(int a,int b){
    e[++idx].to=b;e[idx].nxt=h[a];h[a]=idx;
}
char map[N][N],vis[M];
int match[M*10],dis[N][N],d[N][N][N][N],n,m;
vector  pi,di;
void bfs(int x,int y){
    int dx[]={1,-1,0,0};
    int dy[]={0,0,1,-1};
    memset(dis,-1,sizeof(dis));
    dis[x][y]=0;
    queue q;
    q.push(Node(x,y));
    while(!q.empty()){
        Node u=q.front();q.pop();
        for(int i=0;i<4;i++){
            int ux=u.x+dx[i];
            int uy=u.y+dy[i];
            if(ux>=0&&uy>=0&&ux=pi.size()){
            printf("%d\n",i);
            return ;
        }
    }
    printf("impossible\n");
}
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        idx=0;
        pi.clear();di.clear();
        memset(d,0x3f,sizeof(d));
        memset(h,0,sizeof(h));
        scanf("%d%d",&n,&m);
        for(int i=0;i

你可能感兴趣的:(POJ 3057-Evacuation)