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 阅读(197) 评论(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 阅读(290) 评论(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 阅读(198) 评论(0) 推荐(0) 编辑
摘要: BASHU_2445 题目链接:http://mail.bashu.cn:8080/bs_oj/showproblem?problem_id=2445。 很好的一个题目,让我又加深了对最小费用最大流的问题。一开始自己“意淫”了一个最小费用流的图,结果样例一直算的是180,后来才发现自己还是没有理解好最小费用最大流的含义,所谓的“最小费用最大流”,首要保证的条件是最大流,如果最优的情况未必是原图达到“最大流”时的情况的话,那么是不能用“最小费用最大流”算法去解决的。 那么既然上面yy出了问题,不妨就先着手解决这个问题:要将“最大流”赋予怎样的含义(也就是说确定是什么东西达到“最大”)才能保... 阅读全文
posted @ 2012-08-16 14:13 Staginner 阅读(482) 评论(0) 推荐(0) 编辑
摘要: POJ_3680 一开始想的是将区间放到一边,然后点放到另一边,区间和覆盖的点连边做费用流,但这样很明显是错误的,因为在最大流时源点流入区间的边不一定是满流的,也就是说线段选择性地覆盖了若干个点,这显然是不科学的。 在参考了别人的思路之后,发现保证每个点被覆盖K次,不仅可以每个点都连一条容量为K边到汇点,还可以每个点只连一条容量为K的边到后一个点,相当于把这些点串联起来,这样也可以保证每个点至多被覆盖K次。至于如何描述选择了一个区间(a,b),可以连一条a到b的容量为1费用为w的边,这样只要再额外限定从源点出发的或者是流到汇点的容量为K,那么对于任何一个小区间就最多只会有K条流流过,这样就.. 阅读全文
posted @ 2012-08-16 10:29 Staginner 阅读(529) 评论(0) 推荐(0) 编辑