摘要:
HIT_2713 拿走的最大就等同于留下的最少,因此问题就变成了留下最少价值的宝石使得拿走的宝石都不是相邻的。 先将每个格子按i+j的奇偶性进行黑白染色,然后将S连上所有黑格子,容量为对应格子的价值,再将所有白格子连T,容量也为对应格子的价值,最后将黑格子和相邻的白格子连起来,容量为INF。 我们期望得到的解是这个图的一个割,其中由S出发能到达的点表示留下的白格子以及拿走的黑格子,能够到达T的点表示留下的黑格子以及拿走的白格子,为了使留下的的格子的价值尽可能少,对原图做最小割即可。#include<stdio.h>#include<string.h>#include&l 阅读全文
摘要:
HIT_2634 将S和项目相连,容量为收益,将人和T相连,容量为雇佣的花费,然后将项目和所需的人连起来,容量为INF。实际上我们最后需要的一个结果就是这个图的割:从S出发能到达的点就是我们要做的项目和雇佣的人,能够到达T的点就是不必做的项目和不必雇佣的人。 因为割对应的是不做某些项目以及雇佣某些人,反映的类似“损失”的概念,因此要让这部分“损失”最小,因此求原图的最小割即可。#include<stdio.h>#include<string.h>#include<algorithm>#define MAXD 210#define MAXM 20310#def 阅读全文
摘要:
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] 阅读全文
摘要:
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 阅读全文