Codeforces 786E. ALT 最小割+倍增】的更多相关文章

E. ALT http://codeforces.com/problemset/problem/786/E 题意: 给出一棵 n 个节点的树与 m 个工人.每个工人有一条上下班路线(简单路径),一个工人会得到满足只要下面一项满足:1.他得到一只puppy 2.他的上下班路径上每条边都有一只doge求使所有工人满足的最小dog数并输出方案.n≤20000,m≤10000 想法:暴力建图,源点连向工人Xi,边Yi连向汇点,容量为1.然后工人向其路径上的边连容量为1的边.O(nm) 优化建图:路径为树…
如果把“我全都要”看作是我全不要的话,就可以用最小割解决啦 源点S,汇点T 我们试图让每个市民作为一个等待被割断的路径 把狗狗给市民:建边(S,i,1),其中i是市民 把狗狗给守卫:建边(j,T,1),其中j是守卫(也就是边) 市民要在路上所有边看到狗:建边(i,j,1),其中i是市民,j是i经过的边 (众所周知,(!A)&(!B)==!(A|B),所以要把两种选择串起来) 然而这样边数太多了,考虑倍增来优化建边 ...反正就是倍增优化建边,流量给正无穷 最大流=最小割,跑个dinic就行了(要…
题目链接:CF786E 输出方案暗示网络流 我们考虑最朴素的建图 由源点\(s\)连向所有人,容量为1:树上所有的边视作节点连向\(t\),流量为1:人向其路径上所有的树边连边,流量为\(inf\),跑最小割即可 然而我们发现这样的话网络图中的边的数据规模达到了\(O(n^2)​\),肯定炸掉 于是考虑优化建图 我们将一条路径拆成\(log\)段,用\((i,j)\)表示由节点\(i\)跳到其\(2^j\)层父亲 注意到\((i,j)\)包含着\((i,j-1),(i+2^{j-1},j-1)\…
方案二选一,显然是最小割,朴素的想法就是一排人点一排边点,分别向st连流量1的边,然后人点向路径上的边点连流量inf的边跑最大流 但是路径可能很长,这样边数就爆了,所以考虑倍增,然后倍增后大区间向小区间连,这样路径只要连向log个区间就行了,然后跑最大流 输出方案是在残量网络上从s点沿着没满流的边bfs,因为满流的边一定在最小割里,所以没有访问到的人点和访问到的边点就是能得到宠物的 #include<iostream> #include<cstdio> #include<cs…
题意 现在有m个人,每一个人都特别喜欢狗.另外还有一棵n个节点的树. 现在每个人都想要从树上的某个节点走到另外一个节点,且满足要么这个人自带一条狗m,要么他经过的所有边h上都有一条狗. 2<=n<=2*10^4,1<=m<=10^4 输入格式 第一行为两个整数n,m,分别表示树的大小和人数. 接下来有n-1行,每一行有两个整数u,v,表示书上有一条u-v的边. 再接下来有m行,每一行两个整数x[i],y[i]表示第i个人想从x[i]走到y[i]. 输出格式 第一行为一个整数k,表示…
[题目链接] http://codeforces.com/problemset/problem/724/E [题目大意] 每个城市有pi的物品可以运出去卖,si个物品可以买, 编号小的城市可以往编号大的城市最多运送c的物品,问最多有多少物品可以被买卖 [题解] 源点向每个城市引pi的流,每个城市向汇点引si的流, 小编号的城市往大编号的城市引c的流,那么全图的最大流就是答案, 但是数据量过大,我们考虑转化. 因为最大流等于最小割,我们发现对于这个图,最后每个点不是跟s连就是跟t连, 那么我们设d…
题解: 好题!! 这题似乎能上我代码长度记录的前五? 调试时间长度应该也能上前五QAQ 首先题目要求的明显就是最小割,当然在整个森林上求Q次最小割肯定是会GG的,所以我们需要一个能快速求最小割的算法——最小割树. 最小割树,也叫分治最小割,就是通过预处理把原本的图缩成一颗树,树上两个节点路径上的最小边权就是它们的最小割,这个用树上倍增可以随便维护. 大概思想就是先求一次最小割,把划分出的S和T两个点集继续求最小割,向下分治然后连边缩点. 这题先对每个州预处理最小割树,州和州之间用KD树求出距离最…
Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色的点连向另一种颜色的点,要求经过的边不重复的问题,可以很自然地想到网络流,具体来说咱们建立源 \(S\) 和汇 \(T\),从源点 \(S\) 向所有红色点连容量为 \(1\) 的边,从所有蓝色点向汇点 \(T\) 连容量为 \(1\) 的边,然后将网络内部所有边都改为容量为 \(1\) 的双向边,然后跑最大…
感觉和昨天写了的题一模一样... 这种题也能用hall定理取check, 感觉更最小割差不多. #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pai…
Allowed Letters 最直观的想法是贪心取, 然后网络流取check可不可行, 然后T了. 想到最大流可以等于最小割, 那么我们状压枚举字符代表的6个点连向汇点是否断掉, 然后再枚举64个本质不同的位置, 是否需要切段原点联想它的边, 单次check复杂度64 * 64 用sosdp能优化到64 * 6 #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned lo…