2012年8月18日
摘要:
POJ_3686 看到这个题目后,首先一个思路就是相当于安排每个东西是第几次交给哪个机器做,这样就可以把每个机器拆成N个点当成二分图匹配的题目来做了。但是遇到的最大的问题就是,每个东西的总制造时间会依赖与前面制造的东西,这样每个东西的制造时间就不能独立计算,也就不能用二分图匹配去做了。 但实际上计算这些东西总的制造时间还有另外一种方式,就是对于每个物品而言,除了计算它本身消耗的时间,同时计算上后面的物品会因为它的制造而额外增加的时间。比如如果制造当前这个物品需要的时间是t,而后面还有k个物品要制造,那么就等同于这个物品一共消耗了t+k*t的时间。这样转化之后就会发现计算每个物品的制造时间就..
阅读全文
posted @ 2012-08-18 19:16
Staginner
阅读(259)
推荐(0)
摘要:
POJ_1486 这个题目相当于判断是否存在唯一的二分图最大匹配的问题,只不过最后即便没有唯一的二分图最大匹配,也将已经匹配好的输出即可。 在匹配的时候采用贪心的策略,如果当前有一个点只连了一条边,那么就一定可以唯一的确定出一个匹配,然后不停的这样找直到找完这样的点为止,剩下的如果还有点没进行匹配,那么剩下的点的匹配就不是唯一的了。#include<stdio.h>#include<string.h>#define MAXD 30int N, xM[MAXD], xn[MAXD], yn[MAXD], g[MAXD][MAXD];struct Digit{ int x,
阅读全文
posted @ 2012-08-18 16:25
Staginner
阅读(212)
推荐(0)
摘要:
ZOJ_2587 这个题目本质上就是去判断最小割是否为1,在做完最大流之后的图上,我们从S出发沿非满流的边能走到的点一定是属于S集合的,其余能够沿非满流边走到T的点一定是属于T集合的,如果这时还没有覆盖所有的点,那么那些点就既可以看作是S集合的,也可以看作是T集合的,自然最小割就不唯一了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 810#define MAXM 20010#define INF 0x3f3f3f3fint N, M, first[MAXD], e, n
阅读全文
posted @ 2012-08-18 13:45
Staginner
阅读(205)
推荐(0)
摘要:
POJ_3189 一开始题意各种理解错,首先输入的那个矩阵第i行第j列的值表示的是奶牛i会第j个中意的牛棚,最后求的range就相当于j的range,至于range是变化的范围,比如j在1、2变化,那么range就应该是2,也就是MAX-MIN+1。 因此我们可以枚举range的下界和上届,然后用二分图多重匹配判断是否有解,当然用网络流判断也可以,不过好像比较慢。在枚举range的时候可以做到O(N),比如现在range是[x,y],如果当前无解那么就扩大上届令y=y+1,如果有解就缩小下届令x=x+1。#include<stdio.h>#include<string.h&g
阅读全文
posted @ 2012-08-18 11:37
Staginner
阅读(307)
推荐(0)
摘要:
POJ_3498 对于任何一点来讲,限制的是跳走的企鹅的数量,如果这个点不是终点,那么必然跳过来的企鹅都会跳走,因此实际上限制的是经过这个点的企鹅的数量,这样通过拆点来限制经过点的企鹅的数量就可以了。最后暴力一点,枚举每个点作为终点并判断一下就可以了。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 210#define MAXM 40410#define INF 0x3f3f3f3fint N, first[MAXD], e, next[MAXM], v[MAXM], fl
阅读全文
posted @ 2012-08-18 10:06
Staginner
阅读(282)
推荐(0)
摘要:
POJ_2125 由于最后的目标是不存在一个条x->y的边,因此我们可以构造一个网络流模型(其中x->y连一条容量为INF的边),如果存在S->x->y->T这样的通路,就说明这条边还存在,那么就要通过删除一个点的入边或者出边来达到删掉这条边的目的。这时我们会发现如果任意一个点i只用一个点表示的话,是没办法对删入边和出边做区分的,因此需要将i拆成两个点i、i',那么上面的边x->y就要修正成x->y'。这时我们就可以明晰使S->x->y'->T这样的路径不再存在所需要花费的代价了,无非有两种措施,要么断开S-&
阅读全文
posted @ 2012-08-18 01:39
Staginner
阅读(236)
推荐(0)
摘要:
POJ_3204 这个题目和ZOJ_2532是一样的题目,具体的思路可以参考我的ZOJ_2532的解题报告:http://www.cnblogs.com/staginner/archive/2012/08/11/2633751.html。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 510#define MAXM 10010#define INF 0x3f3f3f3fint N, M, first[MAXD], e, next[MAXM], v[MAXM], flow[M
阅读全文
posted @ 2012-08-18 00:29
Staginner
阅读(178)
推荐(0)
2012年8月17日
摘要:
HDU_3605 之所以写这个题目是因为偶然看到了用匈牙利算法做二分图多重匹配这么个东西,看完之后发现只是在原有求二分图最大匹配的基础上对匈牙利算法做了一点拓展,代码还是很好写的,而且效率也很不错。 如果用网络流做的话,这么多点是承受不了的,但由于M很小,可以将N个点适应各个星球的M个数字综合起来看成一个二进制数,这样就能把N分成2^M类,这样图的顶点的数量就降下来了,于是再用网络流求解就OK了。不过即便这么费事地优化了原图,和裸着用匈牙利算法写的代码相比效率也才快100ms左右,可见匈牙利算法还是很高效的。 至于那些100ms左右的程序应该是用了读入优化以及各种其他的优化吧,这个题用读...
阅读全文
posted @ 2012-08-17 22:19
Staginner
阅读(213)
推荐(0)
摘要:
POJ_3084 这个题目的题意感觉好费解,最后还是连蒙带猜才搞懂的。首先题目中说的门大概是这样的:可以是开着的也可以是锁着的,如果是锁着的也可以从门的某一侧打开,但是另一侧就没法打开。图中每个CP都对应了一个门,CP所在的房间就是能打开锁着的门的那一侧。 实际上我们就是要关闭一些门,使得从入侵者的位置开始(不妨标记为S)出发,不能够到达要保护的房间(不妨标记为T)。对于任意一扇门来讲,如果从能打开它的那一侧走的话,显然锁上也是白搭的,而如果从另一侧走的话,那么锁和不锁还是有区别的。于是不妨将一扇门看成两条边,一条是从能打开它的那一侧走到另一侧的边,容量设为INF,另一条是反向的,容量设为..
阅读全文
posted @ 2012-08-17 17:02
Staginner
阅读(285)
推荐(0)