51Nod 1299 监狱逃离
这其实是一道树形DP的神仙题。
然后开始推推推,1 hour later样例都过不了
然后仔细一看题目,貌似像一个最小割模型,然后5min想了想建图:
- 首先拆点,将每个点拆成进和出两个,然后连边,边权即为\(1\)(表示割掉这条边的代价)
- 然后设超级源\(S\),让\(S\)向所有犯人的出点(因为犯人的点无法割去)连边,边权为\(\infty\),然后对于所有的出口(叶子节点),都向\(T\)连边,边权为\(\infty\)。
- 最后根据题目给出的关系建边,然后因为这些边不可以被割掉,因此边权为\(\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 监狱逃离的更多相关文章
- [51nod1299]监狱逃离
到现在还是不会写系列,直接贴题解了. http://www.51nod.com/question/index.html#!questionId=1157 #include<cstdio> ...
- 【51nod1299】监狱逃离(树形DP)
点此看题面 大致题意: 在一棵树中有\(N\)条边连接\(N+1\)个节点,现在已知这棵树上的\(M\)个节点,要求封住最少的节点,使这\(M\)个节点中的任意一个节点无法到达叶子节点,若能办到输出最 ...
- 动态规划专题(二)——树形DP
前言 \(DP\)这东西真的是博大精深啊...... 简介 树形\(DP\),顾名思义,就是在树上操作的\(DP\),一般可以用\(f_i\)表示以编号为\(i\)的节点为根的子树中的最优解. 转移的 ...
- 【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 ...
随机推荐
- 2018最新大厂Android面试真题
前言 又到了金三银四的面试季,自己也不得不参与到这场战役中来,其实是从去年底就开始看,android的好机会确实不太多,但也还好,3年+的android开发经历还是有一些面试机会的,不过确实不像几年前 ...
- 洗礼灵魂,修炼python(24)--自定义函数(5)—匿名函数lambda
在这个互联网时代,大家都喜欢匿名,匿名上网,匿名登录,匿名操作等等,都不喜欢实名对吧?(虽然说现在实名制已经快到来,题外话,扯远了),当然python里也有个不喜欢实名的,它的功效优点特殊,说强大吧? ...
- java解析复杂json:JSONObject 和 JSONArray的使用
在正式解析之前,我们需要下载解析Json所需要的jar包,一共有7个. 下载地址如下:https://download.csdn.net/download/zai_xia/10374080 大家也可以 ...
- python第九十五天--js正则
定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 JS正则匹配时本身就是支持多行,此处多行匹配只是影响正则表达式^ ...
- 线程:生命周期、实现方式、start()和run()的区别!
1.线程的生命周期 要想实现多线程,必须在主线程中创建新的线程对象.Java语言使用Thread类及其子类的对象来表示线程,在它的 一个完整的生命周期中通常要经历如下的五种状态: 新建:当一个Thre ...
- [MapReduce_8] MapReduce 中的自定义分区实现
0. 说明 设置分区数量 && 编写自定义分区代码 1. 设置分区数量 分区(Partition) 分区决定了指定的 Key 进入到哪个 Reduce 中 分区目的:把相同的 Key ...
- 请问在EXECUTE IMMEDIATE中如何使用带有引号
转自:http://bbs.csdn.net/topics/300191423 从第一引号向后,如果遇到第二个引号,则看这个引号后面时候有紧挨着的引号,如果有则第二个引号被转义,即该保留该引号后面紧跟 ...
- MySQL之慢查询日志分析
在MySQL命令行中查看慢查询日志是否打开了: mysql> show variables like '%slow_query%'; +---------------------------+- ...
- Skip-Gram模型
Stanford CS224n的课程资料关于word2vec的推荐阅读里包含Word2Vec Tutorial - The Skip-Gram Model 这篇文章.这里针对此文章作一个整理. wor ...
- kafka的Java客户端示例代码(kafka_2.12-0.10.2.1)
使用0.9开始增加的KafkaProducer和KafkaConsumer. Pom.xml <project xmlns="http://maven.apache.org/POM/4 ...