[POJ3057] Evacuation
题目
原题地址
解说
这个看着像\(BFS\)一样的东西居然还是个二分图……(当然也要用到\(BFS\))
先\(BFS\)处理处每个人距离每一扇门的最短距离,并分别保存在单独一扇门对应的集合中;
若一个人能到达一扇门,则将该人与之后各时刻该门的建边;
求二分图的最大匹配,看是否能将所有人匹配完;从小时刻向大时刻枚举门,则为最优解。
代码
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAXN = 12+3;
char map[MAXN][MAXN];
int dist[MAXN][MAXN][MAXN][MAXN];
const int INF = 0x3f3f3f3f;
const int dx[4] = {-1,0,1,0};
const int dy[4] = {0,1,0,-1};
int Y,X;
vector G[MAXN*MAXN*MAXN*MAXN+MAXN*MAXN];
bool used[MAXN*MAXN*MAXN*MAXN+MAXN*MAXN];
int match[MAXN*MAXN*MAXN*MAXN+MAXN*MAXN];
vector qX,qY;
vector dX,dY;
void add(int from,int to){
G[from].push_back(to);
G[to].push_back(from);
}
void bfs(int x, int y,int d[MAXN][MAXN]){
d[y][x] = 0;
queue Qx;
queue Qy;
Qx.push(x);
Qy.push(y);
while(!Qx.empty()){
int x1 = Qx.front(); Qx.pop();
int y1 = Qy.front(); Qy.pop();
for(int i=0;i<4;i++){
int x2 = x1+dx[i];
int y2 = y1+dy[i];
if(0<=x2 && x2=0){
for(int k=dist[dY[i]][dX[i]][qY[j]][qX[j]];k<=t;k++){
add((k-1)*dNum+i,t*dNum+j);
}
}
}
solve(V,pNum);
return 0;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&Y,&X);
for(int i=0;i
幸甚至哉,歌以咏志。