上一页 1 ··· 11 12 13 14 15 16 17 18 19 ··· 85 下一页
  2012年8月17日
摘要: POJ_2987 对于这个题目的第一问,无论是放大边权的做法还是dfs找和S连通的做法,限于个人水平有限,暂时对两个做法都没有证明出来是对的,但个人更倾向于第二种方式。 在Edelweiss的《网络流建模汇总》中有提到过如何判断最小割是否唯一。之所以出现最小割不唯一,一部分是源于类似这样的情况:S到1有条容量为1的边,1到T也有条容量为1的边,做完最小割之后两条边的残量都变成0了,也就是说都可以看作是割边,那么1既可以看作是和S相连,也可以看作是和T相连,就这个题目而言是希望和S连的点越少越好,那么一旦出现这种情况就统统认为那个点是和T相连的,因此我们从S开始dfs遇到残量为0的边就不再继.. 阅读全文
posted @ 2012-08-17 15:00 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
  2012年8月16日
摘要: POJ_2455 每条路只走一次可以通过网络流来保证,而对于让最长的边最小可以通过二分枚举来搞定。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 210#define MAXM 80010#define INF 0x3f3f3f3fint N, M, P, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM], MID;int S, T, d[MAXD], q[MAXD], work[MAXD], tx[MAXM];struct E 阅读全文
posted @ 2012-08-16 18:48 Staginner 阅读(196) 评论(0) 推荐(0) 编辑
摘要: POJ_1966 由于枚举的点有可能恰好是割点,所以要分别枚举源点和汇点,而且源点和汇点不能相邻,然后做最大流。所有最大流中的最小值即为最后结果,当然如果所有点都相邻的话结果自然就是N了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 110#define MAXM 10110#define INF 0x3f3f3f3fchar b[110];int N, M, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM], g[MAXD] 阅读全文
posted @ 2012-08-16 17:35 Staginner 阅读(289) 评论(0) 推荐(0) 编辑
摘要: POJ_1273 基础的最大流的题目,构建好图之后直接求解S到T的最大流即可。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 210#define MAXM 410#define INF 0x3f3f3f3fint N, M, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM];int S, T, d[MAXD], q[MAXD], work[MAXD];void add(int x, int y, int z){ v[e] = 阅读全文
posted @ 2012-08-16 16:03 Staginner 阅读(194) 评论(0) 推荐(0) 编辑
摘要: BASHU_2445 题目链接:http://mail.bashu.cn:8080/bs_oj/showproblem?problem_id=2445。 很好的一个题目,让我又加深了对最小费用最大流的问题。一开始自己“意淫”了一个最小费用流的图,结果样例一直算的是180,后来才发现自己还是没有理解好最小费用最大流的含义,所谓的“最小费用最大流”,首要保证的条件是最大流,如果最优的情况未必是原图达到“最大流”时的情况的话,那么是不能用“最小费用最大流”算法去解决的。 那么既然上面yy出了问题,不妨就先着手解决这个问题:要将“最大流”赋予怎样的含义(也就是说确定是什么东西达到“最大”)才能保... 阅读全文
posted @ 2012-08-16 14:13 Staginner 阅读(480) 评论(0) 推荐(0) 编辑
摘要: POJ_3680 一开始想的是将区间放到一边,然后点放到另一边,区间和覆盖的点连边做费用流,但这样很明显是错误的,因为在最大流时源点流入区间的边不一定是满流的,也就是说线段选择性地覆盖了若干个点,这显然是不科学的。 在参考了别人的思路之后,发现保证每个点被覆盖K次,不仅可以每个点都连一条容量为K边到汇点,还可以每个点只连一条容量为K的边到后一个点,相当于把这些点串联起来,这样也可以保证每个点至多被覆盖K次。至于如何描述选择了一个区间(a,b),可以连一条a到b的容量为1费用为w的边,这样只要再额外限定从源点出发的或者是流到汇点的容量为K,那么对于任何一个小区间就最多只会有K条流流过,这样就.. 阅读全文
posted @ 2012-08-16 10:29 Staginner 阅读(528) 评论(0) 推荐(0) 编辑
  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 阅读(249) 评论(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) 编辑
上一页 1 ··· 11 12 13 14 15 16 17 18 19 ··· 85 下一页