上一页 1 ··· 14 15 16 17 18 19 20 21 22 ··· 85 下一页
  2012年8月6日
摘要: POJ_2699 如果直接入手解决最多有多少个的话貌似是没什么思路的,但是由于N很小不妨退一步枚举所有的可能,然后再判定是否可以,这样相对就容易一些了。在枚举的时候没必要枚举所有子集,因为赢的场数多的人是更容易构造成strong king的,于是只要枚举后面若干个人成为strong king就可以了。 接下来要解决的就是判定性问题了,一开始想的是两两之间有无向边,然后将这些无向边定向就可以了,然后每次借助网络流去解决,但是发现建图上会出问题。后来在网上找到了一种建图方式,即把每场比赛看成一个个点,对于i、j之间的比赛如果i必须赢这场就只连i,j必须赢就只连j,否则i和j都连。然后人连源点,.. 阅读全文
posted @ 2012-08-06 12:01 Staginner 阅读(265) 评论(0) 推荐(0) 编辑
  2012年8月5日
摘要: POJ_2391 这个题涉及控制时间的问题,然而时间是不好控制的,换个思路想一下实际上时间的长短反映的只是可否从一个点到达另一个点,因此我们不妨控制一个点到达另一个点是否有通路,这样就等效成控制时间了。 于是不妨先将两两之间最短路求出来,然后二分时间,如果两点之间最短路小于或等于这个时间就看成有这条路,然后建立源点、汇点做最大流,如果最大流等于奶牛的数量就说明这个时间是可以的。需要注意的是,我们需要把field拆点,即点i看成i和i'两个点,连i-j的边时就连i-j'和j-i'两条边,而不能直接在原图上连边。比如样例,如果现在时间是70,那么我们可以连1-2和2-3两条 阅读全文
posted @ 2012-08-05 19:29 Staginner 阅读(373) 评论(0) 推荐(0) 编辑
摘要: POJ_1637 前些日子被各种网络流狂虐一番,现在准备好好搞一搞网络流的题目了,这题果断又被虐了,推荐一篇Edelweiss的网络流建模总结:http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 210#define MAXM 2410#define INF 0x3f3f3f3fint S, T, N, M, first[MAXD], e, next[MAXM], 阅读全文
posted @ 2012-08-05 15:22 Staginner 阅读(244) 评论(0) 推荐(0) 编辑
  2012年8月3日
摘要: UVA_12297 在研究了好一阵子标程之后终于把标程的解体思路弄懂了,其实关键之处就在于标程给出的递推式:f(n, k) = f(n-k, k) + f(n-k, k-1) * 4 + f(n-k, k-2) * 6 + f(n-k, k-3) * 4 + f(n-k, k-4)。 这里f(n, k)表示用k张牌组成和为N的方案数,在递推的时候考虑一共有多少张1。①考虑有0张1:这时就相当于用k张没有任何限制的牌组成和为n-k,然后将每张牌的点数+1,这样自然就没有1了,这部分的方案数是f(n-k, k);②考虑有1张1:这时就相当于用k-1张没有任何限制的牌组成和为n-k,然后将每张牌.. 阅读全文
posted @ 2012-08-03 18:06 Staginner 阅读(587) 评论(0) 推荐(0) 编辑
摘要: CF_152E 这个题目只需要求一棵斯坦纳树,但是蛋疼的是需要打印路径,因此要多开一个数组记录路径。一种还算比较省事的记录路径的办法就是如果是spfa拓展出来的状态就用负数记录一下拓展的方向,如果是子树组合出来的状态就用正数记录一下其中一棵子树的点集状态,这样能很方便的求出另一棵子树的点集状态。#include<stdio.h>#include<string.h>#define MAXN 110#define ST 138#define MAXQ 256010#define INF 0x3f3f3f3fconst int Q = 256000;int dx[] = {- 阅读全文
posted @ 2012-08-03 13:19 Staginner 阅读(980) 评论(0) 推荐(0) 编辑
摘要: HDU_3311 我表示完全没看懂题意……膜拜看懂题意的各位大神,附一份“偷”来的题意: 【题目大意】 给定N个寺庙,和M个另外的地方。 然后给定点权,表示在这个点挖水井需要的代价。 再给定边权,为建造无向边i,j的代价。 然后求怎样弄最小的代价使得前N个点,就是寺庙都能得到水。 这个和一般的斯坦纳树的题目不同的地方在于挖井要加点权,但是仔细分析一下不难发现,如果1-N作为斯坦纳树的叶子节点一共有两种状态,要么挖井要么不挖井,而其他点做为叶子节点只有一种状态,就是必须挖井,否则由于这个节点就可以被删去就一定不会是最优的方案。在dp之前如果将这些叶子节点的状态都初始化好的话,后面的... 阅读全文
posted @ 2012-08-03 08:35 Staginner 阅读(714) 评论(0) 推荐(0) 编辑
  2012年8月2日
摘要: ZOJ_3613 这个题目由于要求一个资源只能供给一个工厂,实际上隐含要求每个连通块里面工厂数大于或等于资源数,否则就会有部分资源是无用的,就会增加没必要的代价。这样如果在最后dp的时候加入这个隐含条件,就可以用统计连通块内的资源数来代替统计可以工作的工厂数。 另外推荐一个感觉讲这类问题讲得比较好的一个博客:http://endlesscount.blog.163.com/blog/static/821197872012525113427573/。#include<stdio.h>#include<string.h>#define MAXD 210#define MAX 阅读全文
posted @ 2012-08-02 18:49 Staginner 阅读(360) 评论(0) 推荐(0) 编辑
摘要: HDU_4085 去年去北京时用网络流死磕这题导致了全场悲剧,今年再做依旧毫无头绪,找到题解一看瞬间震惊了,斯坦纳树(Stenier tree)是什么东东(不过后来发现其实解法就是个状态压缩dp,只不过要借助spfa完成状态转移)……于是只好一点点学习别人的代码了,现在自己理解的还不是很透彻,推荐一篇感觉写得还不错的文章:http://endlesscount.blog.163.com/blog/static/821197872012525113427573/,回头再多做些有关的题目加深一下理解。#include<stdio.h>#include<string.h>#d 阅读全文
posted @ 2012-08-02 14:02 Staginner 阅读(1056) 评论(0) 推荐(1) 编辑
  2012年7月31日
摘要: SPOJ_4556 仔细分析一下的话可以得到最简的状态是对于任意一个点要么只有入度,要么只有出度,否则是可以通过构造得到更优的解的。 这样问题就变成了只要欠钱的人掏钱直接给赊账的人就可以了,也就说没有中转人。于是只要读完数据统计一下欠钱的人一共欠了多少就可以了。#include<stdio.h>#include<string.h>#define MAXD 1010int h[MAXD], N;void solve(){ int i, j, k, tot = 0, ans = 0; memset(h, 0, sizeof(h[0]) * N); for(i = 0; i 阅读全文
posted @ 2012-07-31 19:56 Staginner 阅读(190) 评论(0) 推荐(1) 编辑
  2012年7月24日
摘要: SPOJ_4568 这个题目相当于判断每个圈圈是否是循环同构的,因此可以用字符串的最小表示法来判断。#include<stdio.h>#include<string.h>#define MAXD 1010int N, ini[MAXD][MAXD], g[MAXD][MAXD], a[MAXD << 3], b[MAXD << 3];int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};bool equal(int *a, int *b, int n){ int i, j, k; i = j = k = 0 阅读全文
posted @ 2012-07-24 12:14 Staginner 阅读(244) 评论(0) 推荐(0) 编辑
上一页 1 ··· 14 15 16 17 18 19 20 21 22 ··· 85 下一页