大灾变

发现士兵的流动很像网络流

但是网络流无法表示时间的流逝

所以可以把每个终点拆分为 n n n个点,分别表示不同时刻的点

这样就可以二分转换为判定性的问题,假设二分的值为 m i d mid mid

如果点 i i i距离洞口 x x x有 d i s dis dis米且 d i s < = m i d dis<=mid dis<=mid

就让 i i i连向 x x x的第 d i s dis dis时刻的那个点

然后洞口的每个时刻向终点连边,流量为 1 1 1,表示一个时刻只能走一个人

洞口的每个时刻向下一个时刻连 i n f inf inf边,表示早来的可以等一等去以后的时刻

#include <bits/stdc++.h>
using namespace std;
const int inf=1e9;
const int xxx=4e5+10;
const int maxn=2009;
typedef pair<int,int>p;
map<p,int>mp;
int n,m,id[maxn][maxn],num,s,t,a[maxn];
int dis[xxx],deep[maxn][maxn],ok[maxn];
vector<int>vec[maxn];
struct edge{int to,nxt,flow;
}d[xxx]; int head[xxx],cnt=1;
void add(int u,int v,int flow){d[++cnt]=(edge){v,head[u],flow},head[u]=cnt;d[++cnt]=(edge){u,head[v],0},head[v]=cnt;
}
void dfs(int u,int fa,int root)
{deep[root][u]=deep[root][fa]+1;for(int i=0;i<vec[u].size();i++ ){int v=vec[u][i];if( v==fa )    continue;dfs(v,u,root);}
}
bool bfs()
{for(int i=s;i<=t;i++)   dis[i]=0;dis[s]=1;queue<int>q; q.push( s );while( !q.empty() ){int u=q.front(); q.pop();for(int i=head[u];i;i=d[i].nxt ){int v=d[i].to;if( d[i].flow&&dis[v]==0 ){dis[v]=dis[u]+1;if( v==t )  return true;q.push( v );}}}return false;
}
int dinic(int u,int flow)
{if( u==t )   return flow;int res=flow;for(int i=head[u];i&&res;i=d[i].nxt ){int v=d[i].to;if( dis[v]==dis[u]+1&&d[i].flow){int temp=dinic(v,min(res,d[i].flow) );if( temp==0 ) dis[v]=0;res-=temp;d[i].flow-=temp;  d[i^1].flow+=temp;}}return flow-res;
}
bool isok(int mid)
{s=0,t=num+1;for(int i=1;i<=n;i++){if( !ok[i] )   add(s,i,1);else{for(int j=1;j<mid;j++)    add(id[i][j],id[i][j+1],inf);for(int j=1;j<=mid;j++)    add(id[i][j],t,1);  for(int j=1;j<=n;j++)if( !ok[j]&&deep[i][j]<=mid )add(j,id[i][deep[i][j]],1);}   }int ans=0;while( bfs() )  ans+=dinic(s,inf);cnt=1;for(int i=s;i<=t;i++) head[i]=0;if( ans==n-m ) return true;return false;
}
int main()
{scanf("%d%d",&n,&m);num=n;for(int i=1;i<n;i++){int l,r; scanf("%d%d",&l,&r);vec[l].push_back(r);vec[r].push_back(l);}for(int i=1;i<=m;i++){int x; cin >> x; ok[x]=1;deep[x][0]=-1;dfs(x,0,x);for(int j=1;j<=n;j++)    id[x][j]=++num;}int l=0,r=n,mid,ans=0;while( r>=l ){mid = l+r>>1;if( isok(mid) )  ans=mid,r=mid-1;else  l=mid+1;}cout << ans;
}

51nod 1757大灾变(拆点二分网络流)相关推荐

  1. 51nod 1171 大灾变

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1757 二分答案mid 避难所拆为mid个点 每个避难所的第一个点向第二个 ...

  2. 【bzoj1532】[POI2005]Kos-Dicing 二分+网络流最大流

    题目描述 Dicing 是一个两人玩的游戏,这个游戏在Byteotia非常流行. 甚至人们专门成立了这个游戏的一个俱乐部. 俱乐部的人时常在一起玩这个游戏然后评选出玩得最好的人.现在有一个非常不走运的 ...

  3. [二分+最大流]51 Nod——1757 大灾变

    题目描述 死亡之翼降临了!艾泽拉斯大陆的子民们必须逃出他的魔爪! 艾泽拉斯的结构是一棵树,这棵树上的一些节点是地精建造的通往地下避难所的洞口. 除了这些洞口之外,树上的每个节点上都有一个种族,每个种族 ...

  4. 【HDU - 3081】Marriage Match II(网络流最大流,二分+网络流)

    题干: Presumably, you all have known the question of stable marriage match. A girl will choose a boy; ...

  5. 【bzoj1738】[Usaco2005 mar]Ombrophobic Bovines 发抖的牛 Floyd+二分+网络流最大流

    题目描述 FJ's cows really hate getting wet so much that the mere thought of getting caught in the rain m ...

  6. bzoj 2756 [SCOI2012]奇怪的游戏 二分+网络流

    2756:[SCOI2012]奇怪的游戏 Time Limit: 40 Sec  Memory Limit: 128 MB Submit: 4926  Solved: 1362 [Submit][St ...

  7. 51nod 1307 绳子与重物 二分+dfs / 并查集

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1307 题意: 题解: 方法一: 因为所有绳子最终组成了1棵树 ...

  8. BZOJ 1305 二分+网络流

    思路: 建图我根本没有想到啊--. (我是不会告诉你我借鉴了一下题解的思路) 把每个人拆成喜欢的和不喜欢的点 男 喜欢 向 男 不喜欢 连 边权为k的边 如果男喜欢女 那么 男喜欢向 女喜欢 连 1 ...

  9. POJ-2112 Optimal Milking 二分+网络流

    题意: 有K个挤奶站,C头奶牛,每个挤奶站每天最多只能够为M头奶牛服务,奶牛到奶牛,奶牛到挤奶站都有一个距离,问一天能够为所有的奶牛都挤奶的匹配方案中,选择最远的距离最小方案. 解法: 通过二分枚举来 ...

最新文章

  1. Delphi中的线程类
  2. C# WinForm编程之System.Windows.Forms.DataGridViewRow.DataBoundItem Property
  3. 数据库开发管理中的十条建议
  4. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
  5. JUC学习笔记及拓展
  6. BZOJ1015 JSOI2008 星球大战starwars 并查集
  7. ArcEngine开发之自定义工具
  8. 看〈走出软件作坊〉浅谈扁平化管理
  9. Java — java.lang.NullPointerException - 如何处理空指针异常
  10. 服务网与Kubernetes上的Istio分5步
  11. Swing JTree用法总结
  12. kpw3刷安卓教程2019_买kindle paperwhite4的别急,或许3更好用,因为3可以刷安卓!...
  13. Ubuntu下QT的安装配置
  14. js刷新页面的几种方式与区别
  15. 拆解一个老式电感电容表
  16. Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
  17. 机械臂技术参数的意义
  18. Matlab中text函数在图像中固定位置添加信息的用法
  19. 二十五、Java中的网络编程
  20. Web服务------LNMP架构的安装(Nginx,Mysql,PHP,Discus论坛 安装详解)

热门文章

  1. 计网学习【三】----数据链路层
  2. JNI Log 日志输出
  3. python搭建自动化测试平台_AutoMagic 开源自动化测试平台搭建之修改默认python版本
  4. (论文阅读)目标检测之FCOS
  5. 我优柔寡断的语言选择之路
  6. java Document 删除标签
  7. 学习笔记之——LIO-mapping
  8. 6-8判断回文字符串
  9. 适合IT人的茶:雪域珍品——高原黑珍珠
  10. 数据分析全球油产量及油价变动