这其实是一道树形DP的神仙题。

然后开始推推推,1 hour later样例都过不了

然后仔细一看题目,貌似像一个最小割模型,然后5min想了想建图:

  1. 首先拆点,将每个点拆成进和出两个,然后连边,边权即为\(1\)(表示割掉这条边的代价)
  2. 然后设超级源\(S\),让\(S\)向所有犯人的出点(因为犯人的点无法割去)连边,边权为\(\infty\),然后对于所有的出口(叶子节点),都向\(T\)连边,边权为\(\infty\)。
  3. 最后根据题目给出的关系建边,然后因为这些边不可以被割掉,因此边权为\(\infty\)

然后据说Dinic的最劣复杂度是\(O(n^2m)\)的,所以直接没有畏惧地交了

然后A了?!第一次看到51Nod的题数据这么水(然后莫名复习了一波网络流

当然正解是树形DP,当然可以看陈潇然dalao的博客

DinicCODE

#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
const int N=100005,INF=1e9;
struct edge
{
int to,next,c;
}e[N<<4];
int head[N<<1],n,cnt=-1,m,x,y,dep[N<<1],q[N<<1],s,t,l[N<<1];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void double_add(int x,int y,int z)
{
e[++cnt].to=y; e[cnt].next=head[x]; e[cnt].c=z; head[x]=cnt; ++l[x];
e[++cnt].to=x; e[cnt].next=head[y]; e[cnt].c=0; head[y]=cnt; ++l[y];
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline bool BFS(void)
{
memset(dep,0,sizeof(dep));
int H=0,T=1; dep[s]=1; q[1]=s;
while (H<T)
{
int now=q[++H];
for (register int i=head[now];~i;i=e[i].next)
if (e[i].c&&!dep[e[i].to])
{
dep[e[i].to]=dep[now]+1;
q[++T]=e[i].to;
}
}
return dep[t];
}
inline int DFS(int now,int dist)
{
if (now==t) return dist; int res=0;
for (register int i=head[now];~i&&dist;i=e[i].next)
if (e[i].c&&dep[e[i].to]==dep[now]+1)
{
int dis=DFS(e[i].to,min(dist,e[i].c));
dist-=dis; res+=dis;
e[i].c-=dis; e[i^1].c+=dis;
}
if (!res) dep[now]=0;
return res;
}
inline int Dinic(void)
{
int tot=0;
while (BFS()) tot+=DFS(s,INF);
return tot>=INF?-1:tot;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n); ++n; read(m); s=0; t=(n<<1)+1;
memset(head,-1,sizeof(head));
for (i=1;i<n;++i)
read(x),read(y),++x,++y,double_add(x+n,y,INF),double_add(y+n,x,INF);
for (i=1;i<=m;++i)
read(x),++x,double_add(s,x+n,INF);
for (i=1;i<=n;++i)
{
if (l[i]==1) double_add(i+n,t,INF);
double_add(i,i+n,1);
}
return printf("%d",Dinic()),0;
}

51Nod 1299 监狱逃离的更多相关文章

  1. [51nod1299]监狱逃离

    到现在还是不会写系列,直接贴题解了. http://www.51nod.com/question/index.html#!questionId=1157 #include<cstdio> ...

  2. 【51nod1299】监狱逃离(树形DP)

    点此看题面 大致题意: 在一棵树中有\(N\)条边连接\(N+1\)个节点,现在已知这棵树上的\(M\)个节点,要求封住最少的节点,使这\(M\)个节点中的任意一个节点无法到达叶子节点,若能办到输出最 ...

  3. 动态规划专题(二)——树形DP

    前言 \(DP\)这东西真的是博大精深啊...... 简介 树形\(DP\),顾名思义,就是在树上操作的\(DP\),一般可以用\(f_i\)表示以编号为\(i\)的节点为根的子树中的最优解. 转移的 ...

  4. 【51Nod 1244】莫比乌斯函数之和

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 模板题... 杜教筛和基于质因子分解的筛法都写了一下模板. 杜教筛 ...

  5. 51Nod 1268 和为K的组合

    51Nod  1268  和为K的组合 1268 和为K的组合 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 给出N个正整数组成的数组A,求能否从中选出若干个,使 ...

  6. 51Nod 1428 活动安排问题

    51Nod   1428  活动安排问题 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428 1428 活 ...

  7. 51Nod 1278 相离的圆

    51Nod 1278 相离的圆 Link: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1278 1278 相离的圆 基 ...

  8. 【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501 dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐. 时间 ...

  9. 【51Nod 1622】【算法马拉松 19C】集合对

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1622 简单题..直接暴力快速幂 #include<cstdio&g ...

随机推荐

  1. engineecms——工程师知识管理系统,带文档协作和状态和流程

    工程师们工作的平台,需要对图纸资料按工程项目名称,按工程项目阶段,按参与设计的专业等来分放. 而设计成果需要进行校审,才能算最终成果,也就是要具备状态和流程功能,这个一般网盘资源存储是做不到的. 一些 ...

  2. (小技巧)Sql server查看sql语句的执行时间(转)

    转自CSDN: 在写数据库sql的时候,我们往往很关心该sql语句的执行效率,如下小技巧可以帮助程序员简单快速的得到某条或某几条sql的执行时间. declare @d datetime set @d ...

  3. go 排序sort的使用

    已知一个的struct组成的数组,现在要按照数组中的一个字段排序.python有sort方法,那golang要怎么实现呢?其实golang也有sort方法,并且使用简单,功能强大. 我们先看一下sor ...

  4. docker常用命令整理-在容器中使用service命令

    在docker中使用centos镜像启动了容器并安装了相关软件,之后想用service命令启动相关服务却收到如下错误: Failed to get D-Bus connection: Operatio ...

  5. [20170825]不启动监听远程能连接数据库吗2.txt

    [20170825]不启动监听远程能连接数据库吗2.txt --//曾经写过一篇不启动监听连接数据库的帖子:http://blog.itpub.net/267265/viewspace-1816211 ...

  6. python接口测试—post请求(二)

    使用post请求登陆小极客网. 1.获取登陆接口,及用户名和密码参数 进入小极客网,先注册个账户,修改用户名和密码,然后点击登陆,打开debug调试-进入到network下 输入用户名和密码,点击登陆 ...

  7. 11-OpenLDAP主从同步

    OpenLDAP主从同步 阅读视图 部署环境 OpenLDAP服务器初始化 配置主服务器同步策略 配置从服务器 OpenLDAP主从同步验证 故障诊断 1. 部署环境 本文以两台服务器为蓝本演示其同步 ...

  8. 09-OpenLDAP加密传输配置

    OpenLDAP加密传输配置(CA服务器与openldap服务器异机) 阅读视图 环境准备 CA证书服务器搭建 OpenLDAP服务端与CA集成 OpenLDAP客户端配置 客户端测试验证 故障处理 ...

  9. 简单易懂的程序语言入门小册子(3):基于文本替换的解释器,let表达式,布尔类型,if表达式

    let表达式 let表达式用来声明一个变量. 比如我们正在写一个模拟掷骰子游戏的程序. 一个骰子有6个面. 所以这个程序多次用到了6这个数字. 有一天,我们忽然改变主意,要玩12个面的骰子. 于是我们 ...

  10. Zabbix3.x 监控磁盘IO与自定义模板

    引言 Zabbix自带的模板,帮助我们完成了一些比较常用的监控.但如果想要监控磁盘的IO,zabbix并没有给我们提供这么一个模板,所以我们需要自己来创建一个模板来完成磁盘IO的监控. 操作步骤 1. ...