bzoj1189 [HNOI2007]紧急疏散EVACUATE spfa+网络流+二分

这个题是非常暴力的匹配问题。

首先最好想的思路是给每个人分门的决策,

每个人到每个门的距离直接暴力最短路即可

但不能算出一个门被多个人经过的情况

所以就有了暴力的想法,再给每个人、对每一个门分配一个时间。

这样的话时间的范围就必须确定,不然就是动态借边的网络流

由于时间满足二分的条件,所以二分+网络流检验即可


码:

#include
#include
#include
#include
#include
using namespace std;
#define inf 1000000009
int tot,ans,l,r,s,t,n,d[3000000],m,i,j,k,hou[3000000],v[3000000],zhong[3000000],yuan[3000000],xia[3000000];
char tu[40][40];
bool vis[3000000];
vectorD,dian,jl[3000000];
queueq;
void jian(int a,int b,int c)
{
	++tot;hou[tot]=yuan[a];yuan[a]=tot;v[tot]=c;zhong[tot]=b;	
}
void jia(int a,int b,int c)
{
	jian(a,b,c);
	jian(b,a,0);	
}
void spfa(int o)
{int i;
	memset(d,0x7f,sizeof(d));
	q.push(o);
	d[o]=0;
	while(!q.empty())
	{
		int st=q.front();
		q.pop();
	vis[st]=0;
	for(i=yuan[st];i!=-1;i=hou[i])
	{
		int nd=zhong[i];
	if(d[nd]>d[st]+1)
	{
	d[nd]=d[st]+1;
	if(vis[nd]==0)
	{
	vis[nd]=1;
	q.push(nd);		
	}	
	}		
	}	
	}	
}
bool bfs()
{
	int i;
	memset(d,0x7f,sizeof(d));
	for(i=1;i<=t;i++)
	xia[i]=yuan[i];
	q.push(s);
	d[s]=0;
	while(!q.empty())
	{
		int st=q.front();
		q.pop();
		for(i=xia[st];i!=-1;i=hou[i])
		{
			int nd=zhong[i];
			if(!v[i]||d[nd]400)
{
	printf("impossible");
	return 0;	
}
s=n*m+400*400+1;
t=s+1;
l=0;
while(l>1;
tot=-1;//cout<




你可能感兴趣的:(题目)