Description

原题链接
有一棵树,树上有些特殊点,每个不是特殊点的点有一个人,每个人走过一条边的时间为1。现在所有的人要走到特殊点上,每个点可以有多个人,但每条边每1时间只能走一个人。求所有人到达特殊点的最小时间。

Solution

考虑每个人应该走向哪个洞穴。假如一个人要到一个洞穴\(a_i\),到达距离为\(d\),把每个洞穴拆成\(n\)个点,如果还没有人要走到这个洞穴的第\(d\)号点,那么这个人可以走到这个点,如果已经被另一个人所走到,则可以匹配该洞穴的下一个点或下一个洞穴。要使所有洞穴被走到编号的最大值最小。

于是可以二分答案,于是转换成判定性问题,网络流或者匈牙利判一下有没有匹配即可。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#define fo(i,j,k) for(int i=j;i<=k;++i)
#define fd(i,j,k) for(int i=j;i>=k;--i)
#define rep(i,x) for(int i=ls[x];i;i=nx[i])
using namespace std;
const int N=2010,maxn=1e5+10,M=4e5+10,inf=1e9;
int to[M],nx[M],ls[maxn],vl[M],num=1;
int S,T;
int a[N];
int n,m;
bool bz[N];
void link(int u,int v,int w){to[++num]=v,nx[num]=ls[u],ls[u]=num;vl[num]=w;to[++num]=u,nx[num]=ls[v],ls[v]=num;vl[num]=0;
}
vector<int> e[N];
int d[N][N],now;
void dfs(int x,int fr,int t){d[now][x]=t;int o=e[x].size();fo(i,0,o-1) if(e[x][i]!=fr) dfs(e[x][i],x,t+1);
}
int h[maxn],q[maxn];
bool bfs(){int l=0,r=1;memset(h,0,sizeof(h));h[q[1]=S]=1;while(l<r){int x=q[++l];rep(i,x){if(!vl[i]) continue;int v=to[i];if(!h[v]) h[v]=h[x]+1,q[++r]=v;}}return h[T]>0;
}
int flow(int x,int t){if(x==T) return t;int fl=t;rep(i,x){int v=to[i];if(!vl[i] || h[v]!=h[x]+1) continue;int tmp=flow(v,min(t,vl[i]));t-=tmp,vl[i]-=tmp,vl[i^1]+=tmp;if(!t) break;}if(fl==t) h[x]=-1;return fl-t;
}
bool check(int x){memset(ls,0,sizeof(ls));S=n+x*m+1,T=S+1;num=1;fo(i,1,m)fo(j,1,x){link(i+n+(j-1)*m,T,1);if(j<x) link(i+n+(j-1)*m,i+n+j*m,inf);}fo(i,1,n) if(!bz[i]){link(S,i,1);fo(j,1,m) if(d[i][a[j]]<=x) link(i,j+n+(d[i][a[j]]-1)*m,1);}int ans=0;while(bfs()) ans+=flow(S,inf);return ans==n-m;
}
int main()
{scanf("%d %d",&n,&m);fo(i,2,n){int u,v;scanf("%d %d",&u,&v);e[u].push_back(v),e[v].push_back(u);}fo(i,1,n) now=i,dfs(i,0,0);fo(i,1,m) scanf("%d",&a[i]),bz[a[i]]=1;int l=1,r=n;while(l+1<r){int mid=(l+r)>>1;check(mid)?r=mid:l=mid;}if(check(l)) r=l;printf("%d\n",r);
}

转载于:https://www.cnblogs.com/sadstone/p/9090760.html

【51nod1757】大灾变相关推荐

  1. 51nod1757 大灾变

    能想到二分答案+最大流判断是否符合.但是不知道如何建图qaq.参考的是http://blog.csdn.net/fsss_7/article/details/52132046的建图方法 #includ ...

  2. *51nod1757 大灾变

    $n \leq 2000$的树有$m \leq 40$个洞,其他点上有各不相同的人,人走一个单位要一个时间,每个洞一秒只能让一人过.问最少多少时间所有人通过洞. 二分答案,然后由于洞口不多,可以把洞口 ...

  3. [BZOJ2033][清橙A1215][2009国家集训队]大灾变-半平面交

    大灾变 Description 艾泽拉斯世界经历一场亘古未有的地震过后,大地和海洋被完全撕裂,旧大陆残缺不全.联盟和部落各种族的居民们被迫离开了世代居住的家园,来寻找新的生存空间.原本平坦的陆地上现在 ...

  4. 51nod 1171 大灾变

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

  5. CDDA大灾变 编译安装

    CDDA大灾变 编译安装 网站:链接 文章已经迁移:链接 cdda大灾变?昨天我看到了这个游戏,于是乎,去官网下载,先是下了二进制包,运行后提示没有找到库.ldd命令一看,libSDL这个库没有.但是 ...

  6. 51nod 1757大灾变(拆点二分网络流)

    大灾变 发现士兵的流动很像网络流 但是网络流无法表示时间的流逝 所以可以把每个终点拆分为 n n n个点,分别表示不同时刻的点 这样就可以二分转换为判定性的问题,假设二分的值为 m i d mid m ...

  7. 网络营销案例复制 魔兽大灾变也来“包场门”

    7月11日,多家游戏网站首页又现一幕熟悉的"包场门",铺天盖地的是魔兽大灾变7.12开区的广告.此情此景,不由得让人联想到了<征途2>7月1日的"红色包场&q ...

  8. linux游戏大灾变,深度商店应用数独、大灾变:劫后余生、Tux Typing、Pacman网页版...

    深度商店收录数独.大灾变:劫后余生.Tux Typing.Pacman网页版应用,如果使用Deepin或是统信UOS操作系统,可在深度商店程序上安装它们. 1.数独 数独是一款逻辑性强的数字填充游戏, ...

  9. CDDA大灾变游戏linux,《大灾变CDDA》审判日游戏心得

    <大灾变CDDA>是一款趣味性比较强的沙盒类游戏,庞大的地图和各种建造系统可以让玩家体验到游戏众多的类容,在最新版本的审判日中,游戏也越来越趋于平衡. 审判日游戏心得 审判日这个版本除了尼 ...

最新文章

  1. 对象的当前状态使该操作无效 说明: 执行当前 Web 请求期间,出现未处理的异常。...
  2. web怎么用代码创造表格_Python新工具:用三行代码提取PDF表格数据
  3. boost::hana::partition用法的测试程序
  4. 逆推继承看原型 函数的角色 函数声明和函数表达式的区别 函数中this指向的问题
  5. CodeForces - 1547G How Many Paths?(强联通缩点+拓扑)
  6. 【gateway系列】手把手教你gateway整合nacos注册中心
  7. trycatch处理流IO流中的异常
  8. php mysql 空值_PHP / MySQL插入空值
  9. LINUX下载编译libsndfile
  10. 深度学习与人工智能书籍推荐(从小白到大神)
  11. 『互联网架构』软件架构-软件环境的持续发布管理(上)
  12. UITextView内边距设置
  13. 【知识图谱】实践篇——基于医疗知识图谱的问答系统实践(Part5-完结):信息检索与结果组装
  14. 如果有家公司给你4300的工资,每天闲得发慌,朝九晚六,周末双休,你能坚持多久?
  15. java swing mysql实现的仓库商品管理系统
  16. EXT4分区工具MiniTool Partition Wizard Home Edition
  17. 示波器表笔旁边的夹子是什么_示波器探头容易忽略的几个问题
  18. git 拉取远程仓库分支代码方法
  19. 平板电脑与计算机连接网络,平板电脑连接网络的方法
  20. java字符串中Emoji表情处理

热门文章

  1. Bresenham算法理解
  2. 数据库编程和设计——JDBC技术
  3. Python selenium 使用cookie跳过验证码
  4. 第二天:变量和数据类型
  5. 仿李白写一首关于雪的诗
  6. 基于 azerothcore-wotlk 构建docker wow 335服务端
  7. c#自建Redim动态数组
  8. python分两列输出_python分两列输出
  9. julia调用slurm进行多节点运行
  10. iOS开发之数据库WCDB