网络流
二分抄代码
去了18ec没资格去19ec的反向训练选手
展开
-
hdu6808 1007 Go Running 2020杭电多校第4场
http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1007&cid=882画一个t为x轴,x为y轴的坐标系,由于每个人的速度都是1m/s那么如果两个点是一个人,那么就要么斜率为1,要么斜率为-1,这就转换为了经典二分图匹配模型,一个棋盘,要么选一行,要么选一列,最少选多少个占满所有格子,把一个点变成一条边,左右连接1和-1的情况的点,二分图中最小点覆盖=最大匹配dinic在二分图中跑最大流是n*sqrt(m)的,这里原创 2020-07-30 17:38:55 · 289 阅读 · 0 评论 -
hdu6611 K Subsequence dijkstra版费用流
http://acm.hdu.edu.cn/showproblem.php?pid=6611建图很水,就源点连向子源点一个(k,0)的边,每盘菜拆点,子源点连向左边每个(1,0),每个菜左点右点之间连个(1,-a[i]),右点连汇点(1,0)。然而这题恶心之处在于时间只有2s,空间只有64mb,而有4e6条边,只能用vector存边。而且据说枚举一个点所有边是连续的内存所以比前向星要在边表上跳跃快一些稠密图所以要用dij费用流在只有负边无负环的情况,允许重入队的dij最慢也不会比spfa原创 2020-07-16 22:45:57 · 188 阅读 · 0 评论 -
洛谷P3381 Dijkstra版费用流
https://www.luogu.com.cn/problem/P3381鉴于spfa很容易被卡,所以学了一手dij跑费用流具体参考:https://www.luogu.com.cn/blog/Mogician/Network-Flow-Guide,虽然有个小地方少了个负号,不过还好区别就是把(u->v)边权变成cost+h[u]-h[v],先用spfa算出dis当h[i],然后每次跑完mcf,由于负权边的容量可能增加能选了,就要h[i]+=dis[i]这样动态维护,就能保证每条边都是正原创 2020-07-16 00:40:26 · 253 阅读 · 0 评论 -
H Minimum-cost Flow 2020牛客多校第一场
https://ac.nowcoder.com/acm/contest/5666/H把每次询问记作cost(u/v,1)就是每条边容量都是u/v,总流量是1的情况然后这题的关键就是一个神奇的转换,所有的询问都可以转换成cost(1,v/u)那么如果是边的容量都为1的话,就巨好求了,每次找一条增广路,流量一定是1的,那么把增广路的个数从小到大记过来(本身就是这样)假设至多有tot条增广路,那么v<=u*tot,否则就是nan那么对于d=v/u,t=v%u,d条一定取最小的d条,然后t原创 2020-07-13 00:11:40 · 239 阅读 · 0 评论 -
codeforces 1009G Allowed Letters
可耻地看了题解。。。本来想直接网络流的,然而不知道怎么得到最小的解,看网上有退流的做法可以求字典序最小的最小割集,不过那个退流要每次删掉边在跑增广路,至少是n^2的复杂度,这里1e5的点肯定是不行的。于是想起cf可以看别人代码,于是肮脏地抄起了代码。发现了一种十分神奇的写法,a-f记为0-5,num[c]为字母c剩余的个数,st[i]为第i个位置可以放哪些字母的状态压缩,sum[i][s]记录...原创 2018-07-17 16:41:52 · 390 阅读 · 0 评论 -
NWERC2015 Elementary Math
#include#include#include#define maxl 10010#define inf 2000000001using namespace std;int n,m,S=0,T=maxl-1,cnt=0,numcnt=0,ans;int ehead[maxl],q[maxl],dis[maxl],cur[maxl];long long a[maxl],b[ma原创 2017-10-01 20:14:37 · 385 阅读 · 0 评论 -
2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E Maximum Flow
原题解链接:http://blog.csdn.net/kkkkahlua/article/details/78009087他用的最小割的来求解最大流。认为只要讨论每一个点到0和n-1那个更小哪条边就一定是最小割中的一条边。感觉很有道理,然而不知道是怎么证的。然而在考场上我找规律做的。。。转载 2017-09-19 20:41:50 · 650 阅读 · 0 评论 -
HDU6214 2017青岛赛区网络赛
本弱并不会骚套路,当时并想了很久做不出。将每个边的流量w变成w*(m+1)+1,因为边总数为m,所以后面那个1并不会影响最大流等于最小割的性质,再加上后面那个1体现了边数,跑出来的最大流为a*(m+1)+b,%掉m+1,就得到b,而每一种最大流等于最小割都可以得到相同的a,但b是不同的,由于最大流等于最小割,这个b最大就是最小割的边数。#include#include#define m原创 2017-09-19 19:22:46 · 408 阅读 · 0 评论 -
HDU 3667
因为这个流量的平方乘以ai为代价,就很烦,一般的费用流,怎么改姿势都处理不了。然后又看题解发现了神奇方法。。。将每条边的费用变成1ai,3ai,5ai,9ai,且流量为1,这样吧1条边拆成多条边,流量为1就是1ai,流量为2就是走2条边,(1+3)=4ai=2*2ai;'#include#include#include#include#define maxl 210#define原创 2017-08-26 18:51:26 · 340 阅读 · 0 评论 -
HDU - 3605
十分机智,由于n太大,一般的网络流估计过不了,(然而加了读入优化当前弧优化的代码,上午T掉了,下午A了。。。还是错的模板,反边的流量操作搞成+了。。。)所以因为m只有10,所以对于每个人来说,能适应这些星球的情况最多2^11-1种,于是就可以统计出每种情况的人数,然后把每种情况建个点,有多少人是这种情况,就从源点连多少流量的边到这个点,然后再根据情况连无穷大的边到星球点,最后从星球点连边到汇点,控原创 2017-08-26 18:47:54 · 347 阅读 · 0 评论