51nod 1171 大灾变
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*],nxt[N*],to[N*],cap[N*],tot;
int dis[][N];
int cur[N*],lev[N*];
bool vis[N*],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]=;
}
void build(int mid)
{
memset(front,,sizeof(front));
tot=; decc=n+m*mid+;
for(int i=;i<=m;i++)
{
for(int j=;j<mid;j++)
add(n+mid*(i-)+j,n+mid*(i-)+j+,inf);
for(int j=;j<=n;j++)
if(!safe[j] && dis[i][j]<=mid)
add(j,n+mid*(i-)+dis[i][j],);
}
for(int i=n+;i<decc;i++) add(i,decc,inf);
for(int i=;i<=n;i++) if(!safe[i]) add(src,i,);
}
bool bfs()
{
for(int i=;i<=decc;i++) cur[i]=front[i],lev[i]=-;
queue<int>q;
vis[src]=true;
lev[src]=;
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]]==- && cap[i]>)
{
lev[to[i]]=lev[now]+;
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=,delta;
for(int & i=cur[now];i;i=nxt[i])
if(lev[to[i]]>lev[now] && cap[i]>)
{
delta=dinic(to[i],min(cap[i],flow-rest));
if(delta)
{
cap[i]-=delta,cap[i^]+=delta;
rest+=delta;
if(rest==flow) break;
}
}
if(rest!=flow) lev[now]=-;
return rest;
}
bool check(int mid)
{
build(mid);
int now=;
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]+;
dfs(to[i],x,s);
}
}
int main()
{
scanf("%d%d",&n,&m);
int u,v;
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v,);
}
for(int i=;i<=m;i++)
{
scanf("%d",&u);
safe[u]=true;
dfs(u,,i);
}
int l=,r=n+,mid,ans;
while(l<=r)
{
mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
printf("%d",ans);
}
第1行两个整数n(n<=2000)和m(m<=40)表示节点个数和洞口个数
接下来n-1行每行两个整数表示树上的每一条边
第n+1行m个整数表示所有洞口的编号,保证洞口是叶子节点
一个整数t表示让所有种族躲进地下避难所的最少时间
6 2
1 2
1 3
1 4
1 5
5 6
3 6
3
51nod 1171 大灾变的更多相关文章
- 【51Nod 1244】莫比乌斯函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...
- 51Nod 1268 和为K的组合
51Nod 1268 和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...
- 51Nod 1428 活动安排问题
51Nod 1428 活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...
- 51Nod 1278 相离的圆
51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...
- 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...
- 【51Nod 1622】【算法马拉松 19C】集合对
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...
- 【51Nod 1616】【算法马拉松 19B】最小集合
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1616 这道题主要是查询一个数是不是原有集合的一个子集的所有数的gcd. ...
- 【51Nod 1674】【算法马拉松 19A】区间的价值 V2
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1674 对区间分治,统计\([l,r]\)中经过mid的区间的答案. 我的 ...
- 随便玩玩系列之一:SPOJ-RNG+51nod 算法马拉松17F+51nod 1034 骨牌覆盖v3
先说说前面的SPOJ-RNG吧,题意就是给n个数,x1,x2,...,xn 每次可以生成[-x1,x1]范围的浮点数,把n次这种操作生成的数之和加起来,为s,求s在[A,B]内的概率 连续形的概率 假 ...
随机推荐
- 项目进行ing
1.我们的看板 2.立行会议 (1)照片 (2)时间:每天20:00 (3)地点:学校研发中心会议室 3.看板进展: 已有6个任务被移到Check Out栏中,详细情况如下: 梁植淋:构建项目架构,封 ...
- HDU 2012 FZU 1756关于素数的一些水题
HDU 2012 素数判定 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- UVALive 6913 I Want That Cake 博弈+dp
题目链接: http://acm.hust.edu.cn/vjudge/problem/96343 I Want That Cake Time Limit: 3000MS 64bit IO Forma ...
- HDU 5233 Gunner II 离散化
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5233 bc(中文):http://bestcoder.hdu.edu.cn/contests ...
- sql nolock是什么
百度:SQL Server 中的 NOLOCK 到底是什么意思? 文章地址:http://blog.sina.com.cn/s/blog_7d3b18a50100rfwg.html 查询语句加上 no ...
- virtual judge 本地部署方案
这是一种将自己的电脑当作服务器来部署一个vj的方法,我也是参考前辈们的做法稍作了改动,如果在服务器上部署的话需要在细节上稍作改动: 一.什么是Virtual Judge? vj的工作原理什么? vj ...
- Linux下查看apache连接数
1.查看apache当前并发访问数: netstat -an | grep ESTABLISHED | wc -l 对比httpd.conf中MaxClients的数字差距多少. 2.查看有多少个进程 ...
- .net 错误处理
第一步在页面中写OnError方法: protected override void OnError(EventArgs e) { Exception ex = Server.GetLastError ...
- virtualbox 5.0.6 在debian jessie amd64启动报错
通过dmesg发现vboxdrv启动报错: [ 18.844888] systemd[1]: [/lib/systemd/system/vboxdrv.service:5] Failed to add ...
- (一)MySQL基础篇
1.mysql简介 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 主流的数据库有:sqlserver,mysql,Oracle.SQLite.Access.MS SQL Se ...