[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

幸甚至哉,歌以咏志。

你可能感兴趣的:([POJ3057] Evacuation)