上一页 1 ··· 12 13 14 15 16 17 18 19 20 ··· 85 下一页
  2012年8月14日
摘要: ZOJ_3229 有源汇有上下界的最大流问题,具体的思路可以参考这篇博客:http://blog.csdn.net/water_glass/article/details/6823741,感觉按套路来做就可以了。注意最后输出的时候不是要输出所有的MM。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 375#define MAXD 1375#define MAXM 225740#define INF 0x3f3f3f3fint N, M, first[MAXD], e, ne 阅读全文
posted @ 2012-08-14 21:50 Staginner 阅读(416) 评论(0) 推荐(0) 编辑
摘要: SGU_176 一开始学习有上下界的网络流时都是看的这篇博客上的内容:http://blog.csdn.net/water_glass/article/details/6823741,当看到有源汇最小流问题时怎么都觉得做两遍网络流的算法无论是时间复杂度还是编码复杂度都应该比用二分写更优,但是按那个解法写SGU 176Flow construction却怎么也过不了,后来翻到了另一篇博客:http://hi.baidu.com/dragon_eric123/blog/item/00cd5ac981a9b71f7f3e6f24.html,又发现了另一种做两遍网络流的算法,按这个的思想改了一下之前. 阅读全文
posted @ 2012-08-14 17:24 Staginner 阅读(386) 评论(0) 推荐(0) 编辑
摘要: SGU_194 无源汇的上下界可行流问题,这类的问题的解法可以参考:http://blog.csdn.net/water_glass/article/details/6823741,按套路来就可以了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 210#define MAXM 240010#define INF 0x3f3f3f3fint N, M, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM];int S, T, d[M 阅读全文
posted @ 2012-08-14 15:11 Staginner 阅读(240) 评论(0) 推荐(0) 编辑
摘要: POJ_2396 第一次接触有上下界的网络流问题,感觉只要按套路来就可以了,具体的算法可以参考:http://blog.csdn.net/water_glass/article/details/6823741。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 210#define MAXM 30#define MAXV 230#define MAXE 24900#define INF 0x3f3f3f3fint N, M, low[MAXN][MAXM], high[MAXN 阅读全文
posted @ 2012-08-14 13:09 Staginner 阅读(230) 评论(0) 推荐(0) 编辑
  2012年8月13日
摘要: HDU_4307 从本质上讲,之所以能够用最大流解决这个问题,关键在于最大流可以求解下面这个函数的最小值: 接下来就分析一下如何用最大流求解上面这个函数的极值。 首先xi一共只有两种选择,那么最终可以按xi的取值将xi划分成两个集合,那么如果xi在值为1的集合里,xj在值为0的集合里,那么就会产生一个代价cij。同时如果xi选择0就会产生一个bi的代价,如果xi选择1就会产生一个ai的代价。 于是构造一个源点S,汇点T做最小割,不妨假设做完最小割之后值为1的xi的集合是和S相连的部分,值为0的xi的集合是和T相连的部分。 由于表达式中有三项,我们用三种割边来分别描述这三项的值。一种... 阅读全文
posted @ 2012-08-13 18:03 Staginner 阅读(678) 评论(1) 推荐(1) 编辑
摘要: SPOJ_1693 COCONUTS 对于每个人的选择一共有两种,根据他们最后的选择就可以将这些人分成两个集合,显然集合间如果有朋友形成的边的话是要删掉的,这样实际上就形成了一个割,对应的持不同意见的朋友关系的数量。为了体现出改变自己的意见产生的代价,可以将S和所有起始选择1的人连一条容量为1的边,再将起始选择0的人和T连一条容量为1的边,朋友关系的边都是容量为1的无向边。这样对这个图求最小割就可以得到最后的结果。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 310#de 阅读全文
posted @ 2012-08-13 13:28 Staginner 阅读(449) 评论(0) 推荐(0) 编辑
摘要: SPOJ_839 OPTM 首先直觉上异或操作是不好处理的,于是不妨将mark拆成31位来看待,对每一位都进行一次求解。 于是问题就变成了顶点的标号可以为1也可以为0,边权和最小的问题,于是按标号为1或者为0就可以把顶点划分成两个集合,而连通这两个集合的边的数量就是我们需要累加的边权,为了让数量最少,于是就变成了最小割问题。 这样我们将S和所有mark为1的点连起来,容量为INF,将所有mark为0的点和T连起来,容量为INF,至于那些还没标号的点就不和源点汇点连了,他们的标号取决于做完最小割之后属于哪个集合。接着将其他边建好,容量为1,之后就可以做最大流了,做完最大流后从S出发沿容量不... 阅读全文
posted @ 2012-08-13 11:26 Staginner 阅读(673) 评论(1) 推荐(1) 编辑
  2012年8月12日
摘要: URAL_1277 拆点之后做最大流即可,但要注意S和F在同一个位置的情况。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 210#define MAXM 40410#define INF 0x3f3f3f3fint a[MAXD], N, M, S, F, K, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM];int d[MAXD], q[MAXD], work[MAXD];void add(int x, int y, in 阅读全文
posted @ 2012-08-12 20:25 Staginner 阅读(273) 评论(0) 推荐(0) 编辑
  2012年8月11日
摘要: ZOJ_2532 一种比较好想到的思路就是枚举每条边,将容量增加1,看这样最大流和之前的是否相等,但这样复杂度太高。 于是不妨换种思路,假设现在满流了,我们会考虑增加哪些边的容量呢?显然是满流的边。那么增加了这条边的容量之后,总流量在什么条件下会增加呢?产生一条新的增广路(不知道这个这个名词用得是否恰当,大家意会吧……)。 搞清楚上面的问题之后就会得到一个复杂度较好的算法,枚举做完最大流之后的每条边u->v,如果这条边满流,并且存在S到u的增广路以及v到T的增广路,那么增加这条边的容量就会增大总流量。判断S到u有无增广路可以先用dfs预处理一下,从S点开始只沿非满流的边走,能够到达某个位 阅读全文
posted @ 2012-08-11 16:21 Staginner 阅读(516) 评论(0) 推荐(1) 编辑
  2012年8月8日
摘要: POJ_1815 对于问至少删掉几个点使得S、T不联通,可以将每个点拆成i、i'两个点并连一条容量为1的i->i'的边,将其他关系依次补全后求最小割即可。 但是这个题目要求输出字典序最小的结果,那么就需要依次枚举每个点,如果删掉这个点之后最小割变小了,那么就说明这个点是最小割中的点,将其删除,否则就说名这个点不是最小割中的点,将其恢复。然后重复上面的操作就可以得到字典序最小的序列了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 210#define 阅读全文
posted @ 2012-08-08 17:32 Staginner 阅读(309) 评论(0) 推荐(0) 编辑
上一页 1 ··· 12 13 14 15 16 17 18 19 20 ··· 85 下一页