上一页 1 ··· 13 14 15 16 17 18 19 20 21 ··· 85 下一页
  2012年8月8日
摘要: HIT_2713 拿走的最大就等同于留下的最少,因此问题就变成了留下最少价值的宝石使得拿走的宝石都不是相邻的。 先将每个格子按i+j的奇偶性进行黑白染色,然后将S连上所有黑格子,容量为对应格子的价值,再将所有白格子连T,容量也为对应格子的价值,最后将黑格子和相邻的白格子连起来,容量为INF。 我们期望得到的解是这个图的一个割,其中由S出发能到达的点表示留下的白格子以及拿走的黑格子,能够到达T的点表示留下的黑格子以及拿走的白格子,为了使留下的的格子的价值尽可能少,对原图做最小割即可。#include<stdio.h>#include<string.h>#include&l 阅读全文
posted @ 2012-08-08 15:22 Staginner 阅读(218) 评论(0) 推荐(0) 编辑
摘要: HIT_2634 将S和项目相连,容量为收益,将人和T相连,容量为雇佣的花费,然后将项目和所需的人连起来,容量为INF。实际上我们最后需要的一个结果就是这个图的割:从S出发能到达的点就是我们要做的项目和雇佣的人,能够到达T的点就是不必做的项目和不必雇佣的人。 因为割对应的是不做某些项目以及雇佣某些人,反映的类似“损失”的概念,因此要让这部分“损失”最小,因此求原图的最小割即可。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 210#define MAXM 20310#def 阅读全文
posted @ 2012-08-08 13:46 Staginner 阅读(243) 评论(0) 推荐(0) 编辑
摘要: SPOJ_962 为了保证每个点只经过一次可以将点i拆成i和i',同时连一条i->i'的容量为1的边。 在添加边x<->y的时候,连y'->x和x'->y,最后将S连2',1'和3'连T,看最大流是否为2即可。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 60222#define MAXM 460222#define INF 0x3f3f3f3fint N, M, first[MAXD] 阅读全文
posted @ 2012-08-08 12:07 Staginner 阅读(391) 评论(0) 推荐(0) 编辑
摘要: SPOJ_287 YY了一下颜色的数量取决于网络流中各条边中最大的流量,于是二分边的容量并做网络流就可以了。 但至于为什么颜色的数量取决于网络流中各条边中最大的流量,暂时没有细加证明……#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 510#define MAXM 501010#define INF 0x3f3f3f3fint N, M, K, first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM], list[MAXD];int S 阅读全文
posted @ 2012-08-08 10:51 Staginner 阅读(348) 评论(0) 推荐(0) 编辑
  2012年8月7日
摘要: SGU_438 之所以会有时间的差别,一方面的原因在于过的石头的数量,另一方面的原因就在于石头的承重能力有限。为了体现石头的承重能力,可以将第i个石头拆成i和i'两个点,然后连一条i->i'的边,容量为第i个石头的承重,这样就可以体现出一秒内站在第i个石头上的人不会超过石头的承重。为了计算时间,可以将每个石头再按时间的顺序拆成若干个点建图,然后枚举时间的增长,每次将图补全一层,直到最大流大于或等于M为止。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 阅读全文
posted @ 2012-08-07 22:32 Staginner 阅读(382) 评论(0) 推荐(0) 编辑
摘要: SGU_326 这个题目的武大OJ的1124基本是一样的,只不过多了队外的比赛,对于队外的比赛只要让第1组全部赢而其他组全部输即可,剩下的就和WOJ_1124是一样的处理方式了,具体的思路可以参考我的WOJ_1124的题解:http://www.cnblogs.com/staginner/archive/2012/08/07/2626317.html。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXN 25#define MAXD 430#define MAXM 2450#de 阅读全文
posted @ 2012-08-07 13:16 Staginner 阅读(301) 评论(0) 推荐(0) 编辑
摘要: WHU_1124 首先对于有N参加的比赛,肯定是赢了最好,暂时先不考虑其他的比赛,这是如果各队的积分有大于或等于第N队的,那么肯定是输出NO的。 接下来考虑其他的比赛,对于任意队伍i而言,得分是不等等于或者超过score[N]的,因此可以将源点和i连一条容量为score[N]-score[i]-1的边,由于比赛的总积分是2,自然将比赛和汇点连一条容量为2的边,之后就是谁参加哪场比赛就对应连一条容量为2的边即可,这样做最大流,如果最后能够满流就说明所有的比赛都能安排妥当。#include<stdio.h>#include<string.h>#include<algo 阅读全文
posted @ 2012-08-07 10:54 Staginner 阅读(454) 评论(0) 推荐(0) 编辑
  2012年8月6日
摘要: ZOJ_1760 只要保留S-T所有可能的最短路上的边,然后做最大流即可,题目数据存在f[i][i]!=0的情况,因此如果用floyd预处理的话要注意初始化f[i][i]=0。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 110#define MAXM 20010#define INF 0x3f3f3f3fint N, f[MAXD][MAXD], g[MAXD][MAXD], first[MAXD], e, next[MAXM], v[MAXM], flow[MAXM] 阅读全文
posted @ 2012-08-06 23:24 Staginner 阅读(329) 评论(0) 推荐(1) 编辑
摘要: JOJ_2453 假如最后剩下的是价值为1的若干颗糖,显然这些糖分给谁都是无所谓的,因此我们不妨先考虑如何分配最终价值为2的这些糖,这样剩下的只能是价值为1的糖再按需分配,即谁还少就给谁就行了。而且我们在分配价值为2的糖的时候,第i个人得到的总价值不应大于B[i],因为这样相当于浪费了糖,即便B[i]为奇数也是一样的。但是如果将糖的价值视作2,这样是没办法做网络流的,因为容量为2的边有可能只流满了一半,于是不妨将价值为2的糖看作价值为1,将B[i]看作B[i]/2,然后将源点连各个人,容量为B[i]/2,再将人连上相对于自己而言价值为2的糖,容量为INF,最后将各个糖和汇点相连,容量为1。这. 阅读全文
posted @ 2012-08-06 18:26 Staginner 阅读(426) 评论(0) 推荐(0) 编辑
摘要: POJ_3281 与一般的匹配的问题不同之处在于这个题目需要同时将奶牛和两种东西绑定,沿用以前的匹配问题的思想就是将奶牛、食品、饮料串联在一起,但是如果奶牛和源点或者汇点相连的话就会发现有可能一头牛使用了别的牛的方案,但是如果将奶牛放在食品和饮料之间就不会出现这个问题,不过这时有可能有大于1的流流过奶牛节点,不过没关系,我们只要将奶牛拆点之后就可以避免这个问题了。#include<stdio.h>#include<string.h>#define MAXD 410#define MAXM 41000#define INF 0x3f3f3f3fint S, T, N, F 阅读全文
posted @ 2012-08-06 15:29 Staginner 阅读(200) 评论(0) 推荐(0) 编辑
上一页 1 ··· 13 14 15 16 17 18 19 20 21 ··· 85 下一页