摘要:
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] 阅读全文
摘要:
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。这. 阅读全文
摘要:
POJ_3281 与一般的匹配的问题不同之处在于这个题目需要同时将奶牛和两种东西绑定,沿用以前的匹配问题的思想就是将奶牛、食品、饮料串联在一起,但是如果奶牛和源点或者汇点相连的话就会发现有可能一头牛使用了别的牛的方案,但是如果将奶牛放在食品和饮料之间就不会出现这个问题,不过这时有可能有大于1的流流过奶牛节点,不过没关系,我们只要将奶牛拆点之后就可以避免这个问题了。#include<stdio.h>#include<string.h>#define MAXD 410#define MAXM 41000#define INF 0x3f3f3f3fint S, T, N, F 阅读全文
摘要:
POJ_2699 如果直接入手解决最多有多少个的话貌似是没什么思路的,但是由于N很小不妨退一步枚举所有的可能,然后再判定是否可以,这样相对就容易一些了。在枚举的时候没必要枚举所有子集,因为赢的场数多的人是更容易构造成strong king的,于是只要枚举后面若干个人成为strong king就可以了。 接下来要解决的就是判定性问题了,一开始想的是两两之间有无向边,然后将这些无向边定向就可以了,然后每次借助网络流去解决,但是发现建图上会出问题。后来在网上找到了一种建图方式,即把每场比赛看成一个个点,对于i、j之间的比赛如果i必须赢这场就只连i,j必须赢就只连j,否则i和j都连。然后人连源点,.. 阅读全文