题目描述
题解
首先bfs得出每个门到每个点的最短距离dis。
二分最短时间+最大流判定。
如何判定?
假设二分到mid的时间,对于每个空地I,s->I,1,对于每一个门I,I->t,mid;
在这两排点的中间需要再加一排点,是把每一个门拆成mid个得到的,每个表示某个人用了某些时间到达了这个门。那么显然,对于某一个人i,某个门j,如果dis[i][j] < <script type="math/tex" id="MathJax-Element-65"><</script>mid,那么i->j_dis[i][j],1;
最后对于每一个门拆成的点i_j,i_j->I,mid-j+1,这一步表示在j这个时间到达了i这个门的人只有mid-j+1个人可以通过。
大概长这个样子:
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int max_n=25;
const int max_N=1e5+5;
const int max_m=1e6+5;
const int max_e=max_m*2;