摘要: 题目链接:http://poj.org/problem?id=2135 很容易看出来时最小费用流,但这里要注意是无向边,所以要建立两条边。为了满足退流时,花费还是最小,反向边的花费要为相反数。 1 //STATUS:G++_AC_32MS_980KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<alg 阅读全文
posted @ 2012-12-15 01:27 zhsl 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3469 题目大意:警察抓小偷。有n个房间,编号1-n,小偷躲在其中的一个房间里面,警察每天早上会检查一个房间,如果小偷不在那个房间里面,那么小偷晚上会转向相邻的房间,问警察在最坏情况下需要多少天抓到小偷。 这个题目是分奇偶情况讨论。先假设小偷在第偶数个房间,那么警察从第2个房间依次向右找,知道第n-1个房间(n-1找两次),那么最多只要n-2天就可以了。如果没有找到,那么就可以肯定小偷最开始在第奇数个房间,若房间的个数n为偶数,那么小偷此时肯定在第奇数个房间,那么警察从第n-1个房间向左找到... 阅读全文
posted @ 2012-12-12 17:36 zhsl 阅读(414) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3998 题目大意是:给你一个数列,要你求最长的上升子序列,并且求最多有几个,且每个数只能在每个子序列中出现一次。对于第一问题很容易用DP解决,那么第二个问题,如果每个数可以出现多次的话,DP也很容易解决,但这里必须只能出现一次,否则的话就得判重,复杂度O(n3)。把问题简化一下,就是求长度为s的点不想交的路径有多少条,即每个点的容量为1(拆点),dp值相差为1的建立边,增加源汇点s、t,s向dp值为1的建立边,dp值最大的向t建立边,然后求最大流。 在网上看到这题贪心也可以搞,具体做法就是从... 阅读全文
posted @ 2012-12-11 09:42 zhsl 阅读(460) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3996 很无语加蛋碎的题目!题意描述不清,然后还有超int(这里wa,果断被坑)= =!方法很简单,很容易看出是最大闭合权。 1 //STATUS:G++_AC_109MS_2068KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 阅读全文
posted @ 2012-12-10 01:48 zhsl 阅读(380) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3189 无语了,再次碰到Farmer John,又是二分+匹配的题目= =!注意题目要求求的是range最小,就是最大的rank-最小的rank! 1 //STATUS:G++_AC_94MS_1500KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #incl 阅读全文
posted @ 2012-12-06 17:02 zhsl 阅读(274) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2391 这个题目很容易想到二分求解,我开始没有拆点,wa了很多次!后来发现,如果不拆点,二分枚举答案是没有意义的。因为在网络中,已建立的边可以相互联通,那么它们的距离相加可能会超过二分的限制,导致没有意义。那么我们可以把每个区域拆成两个点,一个在X集合,一个在Y集合,增加一个源点s和汇点t。从s向每个X集合得点建立边,容量为这个区域本原有的奶牛数,从每个Y集合的点建立边,容量为这个区域奶牛数的限制。然后,如果X集合点和Y集合点之间的最短距离小于二分限制的话那就建立边,容量为X集合点的原有的奶牛数。那么最大流就是可容纳的奶牛数... 阅读全文
posted @ 2012-12-05 18:54 zhsl 阅读(436) 评论(0) 推荐(0) 编辑
摘要: 在Acm竞赛中,网络流中求最大流的主流算法有Dinic和Isap,那么这两种算法究竟选哪种好,有些人说Dinic稳定,有些人说Isap效率高,还有人说卡Dinic的题目都是不人道的。为此我分别测试了一下他们的效率。 测试的题目是POJ3469,题目的测试数据足以分辨这两个算法的效率了,所提交的语言为G++。 下面是Dinic的,没有加当前弧优化,用时5469ms。Dinic-没有当前弧优化 1 //STATUS:G++_AC_5469MS_8456KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<stri 阅读全文
posted @ 2012-12-03 18:04 zhsl 阅读(2883) 评论(0) 推荐(1) 编辑
摘要: 题目链接:http://poj.org/problem?id=3469 题目的意思是这样的:有n个任务要处理,现在有一个双核心的CPU,每个任务可以在其中一个核心被完成且需要一定代价,其代价分别为Ai和Bi,如果某些任务在不同的核心上处理,可能需会要需要进行数据交换,即第a个任务和第b个任务为w(a,b,w)。现在要你分配这n个任务,使得所需的代价最小。 开始看到这个题目的时候以为是最小费用流,于是建图建了半天,也没建出来,后来看了下Discuss,才发现是最小割!关键还是在建图上:把每个任务看做点,加源点s和汇点t,从s向每个任务点建立单向边,容量为Ai。从每个任务点向t建里单向边,... 阅读全文
posted @ 2012-12-03 17:17 zhsl 阅读(423) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2112 和POJ2455很像,也是求最大值最小,当时就想到了二分。具体做法就是:先求出每头牛到到牛奶机器的最短路,用spfa或dijkstra(也可以用floyd直接搞)从每个牛奶机器求一次最短路即可,那么这里就可以很容易的看出来可以直接用二分图最大匹配来依次二分求解最佳值,当然也可以用网络流来求最大流,加一个超级源点和超级汇点,源点到每头牛的容量为1,每头牛到每个牛奶机器的容量为1,每个牛奶机器到汇点的容量为m,那么就可以二分来做了。这个题目用二分图做法显然更简单,更方便,但我还是用网络流模型来做了,详细见代码。 1 /... 阅读全文
posted @ 2012-12-01 22:12 zhsl 阅读(275) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2455 题意有点绕,简而言之就是要你找出T条每条边都边不重复的路径,使得的这T条路径中的每段路径的最大值最小,求出这个最大值。首先找出T条边不重复的路径,可以想到用增光路来搞,把每条边的权值赋值为1,那整个网络的最大流就是边不重复的路径的数目了,因为每条边的流量为1,最多只能在一条增广路上,所以最终由多少个可行流就有多少条边不重复的路径,就是最大流了。那么这样就可以比较快的求出来。然后发现,给图的边加个限制,即权值小于等于limit的为可行边,那么T和limit是个线性关系,就可以二分来搞了。然后要注意这个题目的数据有平行边... 阅读全文
posted @ 2012-11-30 00:43 zhsl 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=1273 最大流的裸题,纯水,EK都可以秒过。今天敲了一下ISAP,发现还不是很方便,感觉Dinic好敲多了,而且Dinic的效率又比较稳定,以后如果不是碰到那种特大的数据,还是敲Dinic吧。 1 //STATUS:C++_AC_0MS_760KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include& 阅读全文
posted @ 2012-11-27 23:26 zhsl 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 第一道最大独立集题目,建图有点隐晦。把每个孩子看做一个点,然后把有喜欢的和不喜欢的两个孩子连边,那么就是容易看出是最大独立集题目了。这个可以直接拆点做,然后ans/2。当然要注意加上反向边。也可以把喜欢cat的和喜欢dog的看做二分图的两个集合,因为他们自己之间不会产生矛盾,这样效率可以提高一半左右。 1 //STATUS:C++_AC_31MS_1324KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include< 阅读全文
posted @ 2012-11-27 16:07 zhsl 阅读(384) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2446 昨天没有搞出来,今天汇编课想出来了,发现还是水水的,昨天估计是受到前面两题的影响,一直把思考方向搞错了= =||。 题目要求用1*2的卡片覆盖整个区域,而且要恰好完全覆盖,不能有重叠。仔细发现,每个格子要么是被横着的1*2的卡片覆盖,要么是竖着的覆盖,而且每个只能和周围上下左右的四个格子同时覆盖,那么这里就可以抽象出每个格子和周围四个格子的匹配问题,就像国际象棋的黑白相间的格子一样。 例如(0可放,-1不可放): 0 -1 0 1 0 2 0 0 0 0 0 0... 阅读全文
posted @ 2012-11-26 17:57 zhsl 阅读(428) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2813 典型的最小权覆盖,建图的时候用map标记就可以了,G++一般情况是可以900+ms过得,如果代码写得错了点,就会超时,C++叫一般快200ms的样子。比赛的时候,我加了优化,G++交了n次都超时,后来改成C++交就过了,郁闷得死!后来把map标记改为Trie树,结果203ms飘过,直接刷到了statistic的第三,所以说嘛,Trie的效率不是盖的,以后还是得多用Trie树取代map! 其实还有很多优化的,比如用hash优化等等,不过这个效率也够了。 map+KM: 1 //STA... 阅读全文
posted @ 2012-11-25 22:08 zhsl 阅读(309) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1896 优先队列搞就可以了。 1 //STATUS:G++_AC_234MS_1360KB 2 #include<stdio.h> 3 #include<math.h> 4 #include<stdlib.h> 5 #include<string.h> 6 #include<string> 7 #include<queue> 8 using namespace std; 9 #define pii pair<int,int 阅读全文
posted @ 2012-11-25 20:04 zhsl 阅读(210) 评论(0) 推荐(0) 编辑