正题

题目链接:https://www.luogu.com.cn/problem/CF786E


题目大意

nnn个点的一棵树,mmm个人每个人走一个路径。

给一些人狗或者一些边狗每个人要求要么它自己有狗要么它走的路径上都有狗。


解题思路

考虑最小割,其实就是要么割一个人要么割一整条路径,然后倍增优化连边即可。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=21000,inf=2147483647/3;
struct node{int to,next,w;
}a[N*20];
int s,t,cnt,n,m,tot,f[N][20],p[N][20],vi[N],ls[N],dep[N],z[N];
struct net_flow{node a[N*400]; int tot=1,ls[N*20],dep[N*20],out[N*20];queue<int> q;void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;return;}bool bfs(){memset(dep,0,sizeof(dep));while(!q.empty())q.pop();q.push(s);dep[s]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[y]||!a[i].w)continue;dep[y]=dep[x]+1;if(y==t)return 1;q.push(y);}}return 0;}int dinic(int x,int flow){if(x==t)return flow;int rest=0,k;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[x]+1!=dep[y]||!a[i].w)continue;rest+=(k=dinic(y,min(flow-rest,a[i].w)));a[i].w-=k;a[i^1].w+=k;if(rest==flow)return flow;}if(!rest)dep[x]=1;return rest;}void get_netf(){int ans=0;while(bfs())ans+=dinic(s,inf);printf("%d\n",ans);ans=0;for(int x=1;x<=m;x++)if(!dep[vi[x]])out[++ans]=x;printf("%d",ans);for(int i=1;i<=ans;i++)printf(" %d",out[i]);putchar('\n');ans=0;for(int x=2;x<=n;x++)if(dep[p[x][0]])out[++ans]=z[x];printf("%d",ans);for(int i=1;i<=ans;i++)printf(" %d",out[i]);putchar('\n');}
}nf;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x){p[x][0]=++cnt;if(x!=1)nf.addl(cnt,t,1);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==f[x][0])continue;f[y][0]=x;z[y]=(i+1)/2;dep[y]=dep[x]+1;dfs(y);}
}
void add_path(int pos,int x,int y){if(dep[x]>dep[y])swap(x,y);for(int i=15;i>=0;i--)if(dep[f[y][i]]>=dep[x])nf.addl(pos,p[y][i],inf),y=f[y][i];if(x==y)return;for(int i=15;i>=0;i--)if(f[x][i]!=f[y][i]){nf.addl(pos,p[x][i],inf);nf.addl(pos,p[y][i],inf);x=f[x][i];y=f[y][i];}nf.addl(pos,p[x][0],inf);nf.addl(pos,p[y][0],inf);return;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}s=++cnt;t=++cnt;dep[1]=1;dfs(1);for(int j=1;j<16;j++)for(int i=1;i<=n;i++){f[i][j]=f[f[i][j-1]][j-1];p[i][j]=++cnt;nf.addl(p[i][j],p[i][j-1],inf);nf.addl(p[i][j],p[f[i][j-1]][j-1],inf);}for(int i=1;i<=m;i++){vi[i]=++cnt;int x,y;scanf("%d%d",&x,&y);nf.addl(s,vi[i],1);add_path(cnt,x,y);}nf.get_netf();
}

CF786E-ALT【网络流,倍增】相关推荐

  1. CF786E ALT

    题目大意 给一颗n个节点的树,每个边上有一个守卫.有m个居民,每个居民有一个散步路径(两个节点的树上最短路).一个居民高兴当且仅当他获得了一个宠物或者他散步的路径上所有的守卫都有宠物.求最少需要几个宠 ...

  2. 网络流的各种加边优化

    1.最显然的前缀优化. 2.线段树优化[CF 793G]Oleg and Chess dalao博客 3.倍增优化 CF786E ALT 最小割+倍增lca 这个dalao讲的好 AC Code:(图 ...

  3. 【学习笔记】最大权闭合子图

    对于非 DAG 的图也能用最小割求解最大权闭合子图. 理解:对于一个环,如果正点权有一个没删的话,那么整个环是可达的(相邻的边的容量为 inf),这样环上所有负全点都会向汇点断边,同时为了满足最优性, ...

  4. P4897 【模板】最小割树(Gomory-Hu Tree)(网络流/最小割/树形结构)

    P4897 [模板]最小割树(Gomory-Hu Tree) 这个算法可以用来求解一个无向图上任意两点的最小割,具体过程就是每次选择两个点求最小割,然后在一个新图中这两个点连边,然后对于这两个点的连通 ...

  5. 图论专题1(网络流)

    推荐阅读: 网络流基础知识和Dinic:http://www.cnblogs.com/SYCstudio/p/7260613.html#3848907 建模:https://www.cnblogs.c ...

  6. poj pku图论、网络流入门题总结、汇总

    poj pku图论.网络流入门题总结.汇总 分类: acm图论 2010-08-25 18:49 243人阅读 评论(0) 收藏 举报 网络算法networkgraphconstructioninte ...

  7. alt+tab键的作用是什么?

    alt+tab键的作用是什么? alt键又名交替换档键.更改键.替换键,因为它是英语单词"Alternate"(交换.替换)的缩写,它通常与其他键组合发挥作用,单独是没有作用的. ...

  8. 网络流24题(1) P2756 飞行员配对方案问题

    题目链接 题意:求一个最大的二分匹配,网络流最大流,自己造一个源点一个汇点,源点0到1~m流为1,m+1~n到汇点n+1流为1,然后就是题目给出的也是流为1,图就是这样的,套dinic一个板子,但是题 ...

  9. HDU - 3078 Network 倍增LCA

    倍增lca,把路径上点全部拉出来拍个序输出第k大就过了. 不知道怎么过的,咱也不敢问. #include<stdio.h> #include<string.h> #includ ...

最新文章

  1. opencv判断 线夹角_opencv计算直线的斜率、截距,与水平线弧度值、角度值
  2. WMS(二):Window的删除过程
  3. IntelliJ IDEA 14.0.2破解注册码文件(2015年06月08日)
  4. sql必知必会样例表导入失败_记录WordPress搬家遇到的数据库导入错误问题
  5. 清华出版社送书 50 本,倒计时!
  6. IO的几种分类(详细)
  7. [New Portal]Windows Azure Virtual Machine (17) Virtual Machine成本分析
  8. 网络安全之等级保护问题集
  9. 关于CSS HACK
  10. [渝粤教育] 西南科技大学 土力学基础工程 在线考试复习资料
  11. java中的oop是什么意思_什么是面向对象编程(OOP)?
  12. 如何解决Win10账户没有了管理员权限
  13. Tushare实战分析美国国债收益率与利率的关系
  14. 北京春运更智能:自助验票、微信查询
  15. IIS的安装及web服务器配置
  16. NLP 2.9 深度学习与神经网络
  17. 先决条件检查失败错误
  18. SMB 协议操作共享盘
  19. Pygame实战:我妈50岁,戒不掉消消乐!看我给您安排一款百变款消消乐!厉害!
  20. php裁剪上传图片生成缩略图

热门文章

  1. 嵌入式linux配置qt,基于qt的嵌入式Linux开发环境搭建
  2. 高德面试官问我:JVM内存溢出后服务还能运行吗,我一顿操作行云流水
  3. 七0二所与江南计算机研究所,江南大学:一所被低估的“211”大学,2个A+学科,丝毫不输985...
  4. sm缩写代表什么意思_pe、PE在电气有代表什么意思,你发现没有,电气技术很有意思...
  5. oracle类似isempty,NULLs和empty strings在不同数据库的中特点
  6. python输入日期计算天数_用python计算日期(1、返回指定日期所在的一周,2,计算一个日期的月份和天数加减)...
  7. C++ 学习之旅(15)——继承inheritance
  8. 计算机一级文档题,计算机一级模拟题
  9. android socket 服务端,Android socket 服务端
  10. 高等数学下-赵立军-北京大学出版社-题解-练习11.3