10 2015 档案
摘要:很容易想到源点向所类型有贴纸连边,容量为Bob一开始有的数量;然后贴纸向汇点连边,容量为1。 接下来就是交换部分的连边了。注意交换一次一次进行,每次只能交换一张。 交换,是对于两种贴纸而言,仅会发生在一种贴纸朋友拥有的数量为0,而另一种朋友拥有的数量大于1。 于是这么建图,对于每一个朋友,如果贴纸数
阅读全文
摘要:题目:单边修改,树链查询。 这题是边权,不是点权,不过也可以看作是点权。 然后其实就和BZOJ2819一样。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 #define M
阅读全文
摘要:题目:单点修改、树链查询。 可以直接用树链剖分做。。 修改是O(QlogN),查询是O(QlogNlogN),Q=N=500000; 听说会超时。。 这题也可以用DFS序来做。 先不看修改,单单查询:可以求出每个点到根的xor值,那么对任意两点的查询就等于xor(u)^xor(v)^val(lca(
阅读全文
摘要:题目:一颗树,单边修改,链上查询。。实际上链是根到结点的链。网上好像有其他做法,我的想法是这样的: 先不看修改,毫无疑问查询只是查询结点的深度;而修改一条边会有什么影响:影响是且只是以边上深度最深结点为根的子树。 所以就是DFS序了。把子树转化为区间,然后用区间修改、单点查询的线段树维护。 1 #i
阅读全文
摘要:题目,是对一颗树,单点修改、子树查询。典型的dfs序入门题。 DFS序可以将一颗树与子树们表示为一个连续的区间,然后用线段树来维护;感觉算是树链剖分的一种吧,和轻重链剖分不同的是这是对子树进行剖分的。 我用非递归方式求DFS序。 1 #include<cstdio> 2 #include<cstri
阅读全文
摘要:方法1:两遍最大流。一遍最大流后,把满流边容量+1,非满流边改为INF;再求最小割即为答案。 我大概想了下证明:能构成最小割的边在第一次跑最大流时都满流,然后按那样改变边容量再求一次最小割,就相当于再在那些 满流可能是属于最小割的边 中挑出最少的边形成ST割。 1 #include<cstdio>
阅读全文
摘要:题目是给一些数和<数对>的下标,然后进行操作:对某个<数对>中的两个数同时除以一个都能被它们整除且不等于1的数,要求的就是最多能进行多少次操作。 除数一定是素数,就是要决定某素数要除哪些<数对>使除的次数最多, ik + jk is an odd number 可以想到这个是个二分图,数最多100个
阅读全文
摘要:一开始我把每个店主都拆成k个点,然后建图。。然后TLE。。 看题解= =哦,愚钝了,k个商品是独立的,可以分别跑k次最小费用最大流,结果就是k次总和。。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algor
阅读全文
摘要:人作X部;把门按时间拆点,作Y部;如果某人能在某个时间到达某门则连边。就是个二分图最大匹配。 时间可以二分枚举,或者直接从1枚举时间然后加新边在原来的基础上进行增广。 谨记:时间是个不可忽视的维度。 1 #include<cstdio> 2 #include<cstring> 3 #include<
阅读全文
摘要:如果只有食物或者饮料那就是个二分图最大匹配。 三个真想不出来。。然后看题解。。从源点到食物到牛到饮料到汇点,这样建图。 所以思维不能太局限了,不懂得把食物和饮料放到牛两边,以为牛吃食物饮料、食物饮料被牛吃是符合逻辑的=。= 1 #include<cstdio> 2 #include<cstring>
阅读全文
摘要:题目简单吧,如果知道题目要干嘛的话。 每个比赛指定A赢或者B赢使它们赢得次数不超过1赢得次数。建立一个二分图模型,X部比赛,Y部队伍,用最大流求解,如果最后最大流等于比赛场数就有解。 然而我还是掉坑里了。。。我多算了1在同一赛区赢的次数。。 1 #include<cstdio> 2 #include
阅读全文
摘要:看了题解,自己大概想了下。 最小割唯一的充分必要条件是残量网络中所有点要嘛能从源点floodfill到要嘛能floodfill到汇点。 必要性,这是当然的,因为假设从源点floodfill或者从汇点反着floodfill得到的集合若不相补,那这就有两个最小割的方案,最小割不唯一。 充分性,首先这样就
阅读全文
摘要:把球当作水。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF (1<<30) 7 #define MAXN 1111
阅读全文
摘要:题目求一张图两条边不重复的最短路。 一开始我用费用流做。 源点到1连容量2费用0的边;所有边,连u到v和v到u容量1费用cost的边。 总共最多会增广两次,比较两次求得的费用,然后输出路径。 然而死MLE不过。。 看了题解,是用最大流的做的。 源点到1连容量为2的边;然后把属于最短路的边都加进去,容
阅读全文
摘要:先Floyd求牛到机器最短距离,然后二分枚举最长的边。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF (1<<30
阅读全文
摘要:1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF (1LL<<60) 7 #define MAXN 3333 8 #d
阅读全文
摘要:选择若干条线段使权值最大,并且点覆盖次数不超过k。 建图如下:vs到0建立容量为k费用为0的边;坐标终点到vt连接一条容量为k费用为0的边;对于每两个相邻坐标连接一条容量为INF费用为0的边;对于线段每两个端点连接一条容量1费用为-cost的边。 这样跑最小费用最大流。相当于找出k个线段集合,每个集
阅读全文
摘要:题目问的是从1到n再回到1边不重复走的最短路,本质是找1到n的两条路径不重复的尽量短的路。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6
阅读全文
摘要:比较形象的是地图每个点都拆成三个点,这三个点限制流量为0或1,于是再一分为二,这样每个点都被拆成6个点。。。 其实拆两个点,连容量为柱子高的边,这样就行了。。 这题我掉坑了,“1 lizard was left behind.”。。虽然样例都把一切都说了。。要注意细节。。 1 #include<cs
阅读全文
摘要:把入侵者看作边,每一行每一列都是点,选取某一行某一列都有费用,这样问题就是选总权最小的点集覆盖所有边,就是最小点权覆盖。 此外,题目的总花费是所有费用的乘积,这时有个技巧,就是取对数,把乘法变为加法运算,最后再还原。 另外还可以从最小割的思路去这么理解: 每一行与源点相连,容量为该行的花费;每一列与
阅读全文
摘要:把某点与某几点分开的最小花费,当然想到最小割。具体怎么建图,可以画个简单的情况,然后就清楚了: 0到1不受控制,建立0->1容量为INF的边; 1到0受在0一边的一个控制面板的控制,建立1->0容量为1的边。 1 #include<cstdio> 2 #include<cstring> 3 #inc
阅读全文
摘要:形象生动的最小割。。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF (1<<30) 7 #define MAXN
阅读全文
摘要:看了题解。当时也觉得用邻接矩阵挺好写的,直接memset;然而邻接矩阵不懂得改,于是就放开那个模板,写了Dinic。。 方法是,按字典序枚举每一条满流的边,然后令其容量减1,如果最大流改变了,这条边就是属于某个最小割;接下来一直重复下去,直到得到一个割边集,而它自然是字典序最小的。 我在每次某条边容
阅读全文
摘要:题目要的并不是最大匹配下得到的最大的结果。 网上流行的做法是加边。其实,在连续增广的时候求得一个可行流的总费用为负就停止这样就行了。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 us
阅读全文
摘要:这题第一眼就想到暴力。。 枚举每一个ti,就能确定tj,tj一定是剩下数最大或最小的。为了求tj就要求出数列最大最小次大次小。时间复杂度O(n)。 感觉暴力挺有趣的。 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4
阅读全文
摘要:求一次最大流后,分别对所有满流的边的容量+1,然后看是否存在增广路。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 #define INF
阅读全文
摘要:有向连通图存在欧拉回路的充要条件是所有点入度=出度。 首先随便给定所有无向边一个方向(不妨直接是u->v方向),记录所有点的度(记:度=入度-出度)。 这时如果有点的度不等于0,那么就不存在欧拉回路,就需要改变那些无向边的方向。 而改变一个无向边的方向,相当于边上两个端点的入度和出度都变化了1,它们
阅读全文
摘要:一开始跟着数据结构的书自己写了指针版本的,感觉写得太长太不优雅,后来想学别人用数组模拟指针的那种写法。。不过用不来,所以还是用自己写的吧,至少习惯,也没BUG吧。。LCT那边另外了,写不来,只能抄别人模板。。 1 #include<cstdio> 2 #include<algorithm> 3 us
阅读全文
摘要:http://blog.csdn.net/shahdza/article/details/6317011 inline void in(int &ret){ char c; ret=0; while(c=getchar(),c<'0'||c>'9'); while(c>='0'&&c<='9') r
阅读全文
摘要:最大流,ISAP 抄的(http://www.cnblogs.com/wally/p/3274438.html)改了下。。 最小费用最大流
阅读全文