博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2282 Chocolate
阅读量:6291 次
发布时间:2019-06-22

本文共 2165 字,大约阅读时间需要 7 分钟。

HDU_2228

这是一个二分图最优匹配的题目,但是一开始不知道怎么去构图,后来看了别人的思路之后不由得觉得构图十分巧妙。

如果我们要移动巧克力,最后一定是把盒子中多余的巧克力移到空盒子中去,那么我们不妨以多出的每个巧克力以及每个空盒子为研究对象,这样每个巧克力只能放到一个空盒子中,每个空盒子也只能放一个巧克力,于是就可以构成一个二分图去求最优匹配了,其中边权为巧克力和空盒子的最短距离。

当然为了能应用KM算法,我们在初始化边权的时候可以用MAXD减去最近距离作为边权,之后在统计结果的时候再将其还原即可。

#include
#include
#include
#define MAXD 510 #define INF 1000000000 int a[MAXD], r[MAXD]; int G[MAXD][MAXD], N, nx, ny, yM[MAXD]; int A[MAXD], B[MAXD], slack; int visx[MAXD], visy[MAXD]; void init() {
int i, j, p; ny = 0; for(i = 0; i < N; i ++) {
scanf("%d", &a[i]); if(!a[i]) r[ny ++] = i; } nx = 0; for(i = 0; i < N; i ++) while(a[i] > 1) {
for(j = 0; j < ny; j ++) {
p = abs(i - r[j]); if(N - p < p) p = N - p; G[nx][j] = MAXD - p; } a[i] --; nx ++; } } int searchpath(int u) {
int v, temp; visx[u] = 1; for(v = 0; v < ny; v ++) if(!visy[v]) {
temp = A[u] + B[v] - G[u][v]; if(temp == 0) {
visy[v] = 1; if(yM[v] == -1 || searchpath(yM[v])) {
yM[v] = u; return 1; } } else if(temp < slack) slack = temp; } return 0; } void EK() {
int i, j, u; for(i = 0; i < nx; i ++) {
A[i] = 0; for(j = 0; j < ny; j ++) if(G[i][j] > A[i]) A[i] = G[i][j]; } memset(B, 0, sizeof(B)); memset(yM, -1, sizeof(yM)); for(u = 0; u < nx; u ++) for(;;) {
memset(visx, 0, sizeof(visx)); memset(visy, 0, sizeof(visy)); slack = INF; if(searchpath(u)) break; for(i = 0; i < nx; i ++) if(visx[i]) A[i] -= slack; for(i = 0; i < ny; i ++) if(visy[i]) B[i] += slack; } } void printresult() {
int i, res = 0; for(i = 0; i < ny; i ++) if(yM[i] != -1) res += MAXD - G[yM[i]][i]; printf("%d\n", res); } int main() {
while(scanf("%d", &N) == 1) {
init(); EK(); printresult(); } return 0; }

转载地址:http://gccta.baihongyu.com/

你可能感兴趣的文章
轻松学PHP
查看>>
Linux中的网络监控命令
查看>>
this的用法
查看>>
windows下安装redis
查看>>
CentOS7 yum 安装git
查看>>
启动日志中频繁出现以下信息
查看>>
httpd – 对Apache的DFOREGROUND感到困惑
查看>>
分布式锁的一点理解
查看>>
idea的maven项目,install下载重复下载本地库中已有的jar包,而且下载后jar包都是lastupdated问题...
查看>>
2019测试指南-web应用程序安全测试(二)指纹Web服务器
查看>>
树莓派3链接wifi
查看>>
js面向对象编程
查看>>
Ruby中类 模块 单例方法 总结
查看>>
jQuery的validate插件
查看>>
5-4 8 管道符 作业控制 shell变量 环境变量配置
查看>>
Enumberable
查看>>
开发者论坛一周精粹(第五十四期) 求购备案服务号1枚!
查看>>
validate表单验证及自定义方法
查看>>
javascript 中出现missing ) after argument list的错误
查看>>
使用Swagger2构建强大的RESTful API文档(2)(二十三)
查看>>