博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
51Nod 1299 监狱逃离
阅读量:5291 次
发布时间:2019-06-14

本文共 1335 字,大约阅读时间需要 4 分钟。

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

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

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

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

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

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

当然正解是树形DP,当然可以看

DinicCODE

#include
#include
#include
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
=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

转载于:https://www.cnblogs.com/cjjsb/p/9356428.html

你可能感兴趣的文章
JavaScript基础---获取元素的属性(title,style,width)
查看>>
简单了解HashCode()
查看>>
闭包理解
查看>>
asp.net C#后台实现下载文件的几种方法(全)
查看>>
MySQL用户变量的用法
查看>>
HDU 2002 计算球体积
查看>>
Web前端开发工程师的具备条件
查看>>
为什么要用日志框架 Logback 基本使用
查看>>
实用Android开发工具和资源精选
查看>>
TileMap
查看>>
JS属性大全
查看>>
java复制文件
查看>>
第一册:lesson seventy nine.
查看>>
GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例
查看>>
团队作业
查看>>
数据持久化时的小bug
查看>>
mysql中key 、primary key 、unique key 与index区别
查看>>
bzoj2257
查看>>
Linux查看文件编码格式及文件编码转换<转>
查看>>
Leetcode: Find Leaves of Binary Tree
查看>>