摘要: 题意:有N头牛,F种食物,D种饮料,每头牛有自己喜欢的食物和饮料,每种食物/饮料只能被一头牛享用,每头牛只能享用一种饮料和一种食物,求最后能有几头牛享用到自己喜欢的食物或饮料。解法:很容易想到建图方法,食物放左边,饮料放右边,牛放中间,然后按照给定的关系连边,但这里需要对牛拆点,如果不拆的话,比如有这样的两条链,s->食物1->牛1->饮料1->t,s->食物2->牛1->饮料2->t,这两条路都会被增广,从而出现错误,因为建图的时候并没有限制“每头牛只能享用一种饮料和一种食物”这个条件,拆点之后就有了限制。。。 1 #include<cs 阅读全文
posted @ 2013-01-23 17:54 silver__bullet 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 题意:求从顶点1走到n再走回1的最短路径,每条边只能走一次。解法:最小费用最大流,另设源点汇点,从源点到1连边,从n到汇点连边,这两条边都是容量为2,费用为0,表示要走两条包含源点(或汇点)的边,因为一去一回走的边不一样。。其余的边正常建就行,费用就是路径长度。。 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 #define N 1010 6 using namespace std; 7 const int inf=1<< 阅读全文
posted @ 2013-01-20 16:16 silver__bullet 阅读(193) 评论(0) 推荐(0) 编辑
摘要: 寒假也没那么多的事情,大概可以安心学写东西刷刷题了,列个计划,内容有点庞大,何时能做完不太确定,我会尽我最大努力的。 图论: 1.各种网络流的基本建图思想: 最大流;[done] 最小割; 带上下界的网络流; 费用流;[done] 2.连通性问题: 无向图边连通度的求解: 强连通的灵活应用;[done] 3.匹配问题: 二分图最大匹配:匈牙利算法;[done] 最优匹配:KM算法;[done] 4.最短路: k短路的求法;[done] [复习]堆优化的dijkstr... 阅读全文
posted @ 2013-01-18 19:06 silver__bullet 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 列个清单吧。。如果一个计算机系的人除了会打点算法竞赛别的什么也不会该是有多悲剧。。。。当然,没退役之前还是以acm为主。。。 Java,Python什么的,还想学学FP编程,比如Haskell什么的。。。以后想往哪方面发展也不太确定,目前对AI和密码学表示充满兴趣。。。争取涉猎下。。。 ACM什么的不必多说了。。。 阅读全文
posted @ 2012-12-31 20:22 silver__bullet 阅读(288) 评论(3) 推荐(0) 编辑
摘要: 题意:给定n(n<=16&&n为偶数)对点的坐标,现在要将他们分成n组,使得每组两个点距离之和加起来最小。。。解法: 状态压缩,用0 1表示该点是否已经被分配完。。然后记忆化搜索。。。 1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<iostream> 5 #include<cmath> 6 #include<algorithm> 7 #define N 1<<21 8 #define M 30 9 阅读全文
posted @ 2012-12-27 18:30 silver__bullet 阅读(229) 评论(0) 推荐(0) 编辑
摘要: 解法:状态压缩。只有12个洞,所以状态最多只有2^12种。。。然后dfs一下找出来所有合法状态即可。 对于位运算的操作: x&(1<<i)表示取出第i位; x&(~(1<<i))表示把第i位变成0; x|(1<<i)表示把第i位变成1; 1 #include<cstdio> 2 #include<iostream> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 阅读全文
posted @ 2012-12-26 18:12 silver__bullet 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 期末考试真是令人纠结的东西。。。最近除了做比赛之外不打算大规模刷题了。。要不期末稳跪。。。A.有坑的一题。。。需要注意m和n的大小,别的没啥了。。。A 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int main(){ 6 freopen("input.txt","r",stdin); 7 freopen("output.txt","w",stdout) 阅读全文
posted @ 2012-12-11 12:30 silver__bullet 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 题意:给定n个物品,用这n个物品填充一个背包,使得没有被装入的物品一定塞不进背包,统计方案数。解法:对于普通的01背包统计方案数很简单,dp[j]=dp[j]+dp[j-w[i]]...这题需要对重量进行排序,然后枚举每个物品,使之成为没有被装入背包的最小重量,那么对于重量小于w[i],的,一定会被装入背包,对于大于w[i]的,我们只需要进行一次01背包统计方案即可,最后找出满足条件的累加。。。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define N 1010 5 #d 阅读全文
posted @ 2012-12-06 23:27 silver__bullet 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个含有n个数的序列,从中找出连续长度不超过k的非空子序列,使其和最大。(n<=10^5,k<=10^5)解法:考虑最朴素的做法,用maxn[i]表示以i为结尾,长度不超过k的非空子序列的最大和,那么有maxn[i]=sum[i]-max{sum[i-1]...sum[i-k]},直接做的话时间复杂度O(n*k),看到表达式中后一部分,可以采用单调队列解决,维护一个sum[i]单调递增的单调队列,那么每次求解maxn[i]就可以直接取队列头,复杂度降到O(1),由于长度不大于k,所以每次插入之后还要删掉不满足条件的队头元素。。。 1 #include<cstdio& 阅读全文
posted @ 2012-12-05 23:29 silver__bullet 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 题意:从给定的序列中选出一定数目的三元组x,y,z(x<=y<=z),使得所有三元组中(x-y)^2之和最小解法:解法类似于hdu搬寝室那个题,但是这里多了一个z的限制,对于z的处理,我们可以把这个序列按照降序排列,这样的话就能消除z的影响. 为什么呢?想一下状态转移方程,dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(s[i]-s[i-1])*(s[i]-s[i-1])); 也就是说dp[i][j]的值可能在求dp[i-1][j]时已经得到了,而在这里,我们可以通过"j<=i/3"这个限制保证不会选到最大的... 1 #inc 阅读全文
posted @ 2012-11-30 21:21 silver__bullet 阅读(213) 评论(0) 推荐(0) 编辑