http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1757

二分答案mid

避难所拆为mid个点

每个避难所的第一个点向第二个点,第二个点向第三个点……连inf边

每个点向汇点连流量为1的边

枚举能在mid时间内到达避难所i的点j,假设时间为t,由点j向点i的第t个点连流量为1的边

源点向每个非避难所节点连流量为1的边

最大流判断能否==n-m

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 2001
using namespace std;
int n,m,p,src,decc,cnt;
int front[N*200],nxt[N*500],to[N*500],cap[N*500],tot;
int dis[41][N];
int cur[N*200],lev[N*200];
bool vis[N*200],safe[N];
const int inf=2e9;
void add(int u,int v,int w)
{to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; cap[tot]=w;to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; cap[tot]=0;
}
void build(int mid)
{memset(front,0,sizeof(front));tot=1;    decc=n+m*mid+1;for(int i=1;i<=m;i++){for(int j=1;j<mid;j++) add(n+mid*(i-1)+j,n+mid*(i-1)+j+1,inf);for(int j=1;j<=n;j++)if(!safe[j] && dis[i][j]<=mid) add(j,n+mid*(i-1)+dis[i][j],1);}for(int i=n+1;i<decc;i++) add(i,decc,inf);for(int i=1;i<=n;i++) if(!safe[i]) add(src,i,1);
}
bool bfs()
{for(int i=0;i<=decc;i++) cur[i]=front[i],lev[i]=-1;queue<int>q;vis[src]=true;lev[src]=0;q.push(src);int now;while(!q.empty()){now=q.front();q.pop(); vis[now]=false;for(int i=front[now];i;i=nxt[i])if(lev[to[i]]==-1 && cap[i]>0){lev[to[i]]=lev[now]+1;if(to[i]==decc) return true;if(!vis[to[i]]){vis[to[i]]=true;q.push(to[i]);}}}return false;
}
int dinic(int now,int flow)
{if(now==decc) return flow;int rest=0,delta;for(int & i=cur[now];i;i=nxt[i])if(lev[to[i]]>lev[now] && cap[i]>0){delta=dinic(to[i],min(cap[i],flow-rest));if(delta){cap[i]-=delta,cap[i^1]+=delta;rest+=delta; if(rest==flow) break;}}if(rest!=flow) lev[now]=-1;return rest;
}
bool check(int mid)
{build(mid);int now=0;while(bfs()) now+=dinic(src,inf);if(now==n-m) return true;return false;
}
void dfs(int x,int f,int s)
{for(int i=front[x];i;i=nxt[i])if(to[i]!=f){dis[s][to[i]]=dis[s][x]+1;dfs(to[i],x,s);}
}
int main()
{scanf("%d%d",&n,&m);int u,v;for(int i=1;i<n;i++){scanf("%d%d",&u,&v);add(u,v,0);}for(int i=1;i<=m;i++){scanf("%d",&u);safe[u]=true;dfs(u,0,i);}int l=1,r=n+1,mid,ans;while(l<=r){mid=l+r>>1;if(check(mid)) ans=mid,r=mid-1;else l=mid+1;}printf("%d",ans);
}

1757 大灾变
基准时间限制:3 秒 空间限制:262144 KB 分值: 160  难度:6级算法题

 收藏
 关注

死亡之翼降临了!艾泽拉斯大陆的子民们必须逃出他的魔爪!

艾泽拉斯的结构是一棵树,这棵树上的一些节点是地精建造的通往地下避难所的洞口。
除了这些洞口之外,树上的每个节点上都有一个种族,每个种族通过树上的一条边都需要一个单位时间。
因为地精比较矮小,所以洞口很窄,每个单位时间只能让一个种族通过,但是一个单位时间内的一个节点上可以存在多个种族。
地精们需要你求出最少需要多少单位时间才能让所有种族躲进地下避难所。
【注意题目有修改,洞口不一定是叶子节点】

Input
第1行两个整数n(n<=2000)和m(m<=40)表示节点个数和洞口个数
接下来n-1行每行两个整数表示树上的每一条边
第n+1行m个整数表示所有洞口的编号,保证洞口是叶子节点
Output
一个整数t表示让所有种族躲进地下避难所的最少时间
Input示例
6 2
1 2
1 3
1 4
1 5
5 6
3 6
Output示例
3

转载于:https://www.cnblogs.com/TheRoadToTheGold/p/7512407.html

51nod 1171 大灾变相关推荐

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

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

  2. 51nod 1617 奇偶数组

    传送门 回来看一眼51nod,发现自己掉到rank4了,赶紧切道题回rank3. 一眼不会做,这种东西应该慢慢找规律吧--然后看到数据范围其实比较小,应该是单次log的,那是不是可以分治啊. #inc ...

  3. 51NOD 1773:A国的贸易——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773 参考1:FWT讲解 https://www.cnblogs.com ...

  4. 51nod 1040:最大公约数之和(数论)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 给出一个n,求1-n这n个数,同n的最大公约数的和. ...

  5. (DP)51NOD 1183 编辑距离

    编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除 ...

  6. 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)

    二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线的数量. 二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y).例如:(2,3) (3,4) (1,5) (4, ...

  7. 51Nod 1003 阶乘后面0的数量(数学,思维题)

    1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...

  8. 51nod 1270 数组的最大代价

    1270 数组的最大代价 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 数组A包含N个元素A1, A2......AN.数组B包 ...

  9. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    51nod 算法马拉松18 B 非010串 矩阵快速幂 非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串 ...

最新文章

  1. 全球及中国通信中的量子计算行业十四五规划方向与运营前景研究报告2022版
  2. Shell的基本语法结构
  3. python中pandas安装视频教程_详解Python中pandas的安装操作说明(傻瓜版)
  4. Docker学习笔记 - Docker Compose
  5. 前端学习(3253):vs code中组件化编码
  6. [LeetCode]Remove Nth Node From End of List
  7. (14)System Verilog范围随机函数
  8. utittest和pytest中mock的使用详细介绍
  9. 廖雪峰Java2面向对象编程-6Java核心类-5枚举类
  10. 转 点击关闭时最小化到任务栏
  11. 大气压力换算公式_大气压强计算方法
  12. 图虫知识共享协议_100%避免图片版权侵权的方法(网站图片侵权赔款标准)
  13. 开视界 创未来丨酷雷曼第十期合作商交流会圆满举办
  14. element表格固定表头
  15. 通讯软件002——快速使用modscan进行modbus调试
  16. BlockVC入选首批36氪中国区块链投资机构风云榜
  17. python实现猜数字游戏_python如何实现猜数字游戏
  18. php连接不同编码oracle,PHP连接Oracle出现中文乱码问题
  19. Nand Flash学习笔记3-Read Disturb
  20. Ubuntu20.04 下 rstudio 安装教程(附安装包下载)

热门文章

  1. C++ 中explicit的作用及用法(虽然简单,但是还是有用的)
  2. THREE.Object3D.add: object not an instance of THREE.Object3D.
  3. Mark Something
  4. MacOS在zsh环境下安装和使用终端插件autojump
  5. 使用remoteApp发布金蝶K3
  6. Python基础 NumPy数组相关概念及操作
  7. lsd 特征点匹配代码_线特征LSD and 描述子LBD---LBD算法(二)
  8. 乐视能在电视机行业复制小米的成功吗?
  9. 直播答题技术方案解析
  10. mybatis使用事务