2012年8月15日
摘要: SPOJ_371 BOXES 这个题目和HDU_2282几乎是一样的,我们可以把每个“多余”的ball当做一个研究对象,那么它一共有若干种选择,即移动到若干个空位,这样将“多余”的ball看成一组,所有的空位看成另一组,就构成了二分图,于是可以用二分图最优匹配来做。 但是这样做是O(N^3)的复杂度,即便改成费用流算法,如果建图不加变化的话,依旧是O(N^3)的算法。于是我们要简化思路,尽管对一个空位来讲,可能是任意一个位置的球经过了若干步移到这里,但实际上也就只有两种状况,要么是先移动到这个空位左边的位置,再移动到中间这里,要么就是先移动到这个空位右边的位置,再移动到中间来。因此我们只需.. 阅读全文
posted @ 2012-08-15 23:41 Staginner 阅读(223) 评论(0) 推荐(0) 编辑
摘要: HIT_2739 这个题目实际上相当于问至少给原图补多长的边才能够成一个欧拉回路,只不过这些补的边只能是由原图的若干条边拼接成的。 对于入度大于出度的点应该和出度大于入度的点相连,如果确定点a和点b要连接的话,那么补的边应该是a到b的最短路,只不过我们现在不知道究竟应该将哪些点连接起来。 其实可以构造费用流来解决到底哪些点相连的问题,首先将点按入度大于出度的(不妨记作a类点)和出度大于入度的(不妨记作b类点)分成两组,至于入度和出度相等的点是可以忽略的。然后将源点和a类点连容量为入度-出度,费用为0的点,同样的将b类点和汇点连容量为出度-入度,费用为0的点,这样就通过容量保证了每个点最终... 阅读全文
posted @ 2012-08-15 17:07 Staginner 阅读(298) 评论(0) 推荐(0) 编辑
摘要: HIT_2715 这个题目和HIT_2543比较像,每个点有两种性质,走第一次的时候会花费w,后面再走花费就会变为0。于是不妨将一个点拆成两个点,并连两条边,一条为容量为1花费为w的边,另一条为容量为INF花费为0的边。再将其余的边连好之后做最大费用最大流即可,由于题目限制行走过程中不会出现环,所以就不必担心有正圈了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 50#define MAXD 5010#define MAXM 35010#define INF 0x3f3f 阅读全文
posted @ 2012-08-15 14:22 Staginner 阅读(250) 评论(0) 推荐(0) 编辑
摘要: HIT_2543 实际每条边一共有两种费用,一种是为0,另一种是c2,而且为0的费用对应的容量是c1,为c2的费用对应的容量是INF。既然一条边有着两条边的属性,不如索性拆成两条边算了,一条容量c1费用为0的边,和一条容量为INF费用为c2的边。 由于c2>=0,我们在做费用流的时候会优先选择容量c1费用为0的边,这样就保证了结果是正确的。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 1010#define MAXM 80010#define INF 0x3f3f3 阅读全文
posted @ 2012-08-15 11:33 Staginner 阅读(225) 评论(5) 推荐(0) 编辑