hdu2282 Chocolate 完美匹配 + 拆点
题意:
N个箱子排成一个圈,所有的箱子里的巧克力的数量加起来不大于N,每次可以把箱子里的巧克力向旁边的箱子转移(两个方向),问要让每个箱子里的巧克力不大于1的最小步数。
分析:
把巧克力大于1的箱子拆为 pi-1 个箱子(点),向没有巧克力的箱子建边,权值为最短距离。因为是一个圈,任意两点之间有两条路径,所以需要取小的一个值。X集合里的点的编号与原本图中的点无关,所以从0(1)开始,Y集合的点个数是N。
拆点很新颖,在完美匹配中,这是第一次遇到。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
//O(m*m*n)
const int N=, INF=0x3f3f3f3f;
int Map[N][N],mat1[N],mat2[N];//匹配上的左右集合
int KM(int m,int n)
{
int s[N],t[N],a[N],b[N];
int i,j,k,p,q,ans=;
for(i=;i<m;i++)
{
a[i]=-INF;
for(j=;j<n;j++)
a[i]=Map[i][j]>a[i]?Map[i][j]:a[i];
if(a[i]==-INF) return -;//cannot match
}
memset(b,,sizeof(b));
memset(mat1,-,sizeof(mat1));
memset(mat2,-,sizeof(mat2));
for(i=;i<m;i++)
{
memset(t,-,sizeof(t));
p=q=;
for(s[]=i;p<=q&&mat1[i]<;p++)
{
for(k=s[p],j=;j<n&&mat1[i]<;j++)
{
if(a[k]+b[j]==Map[k][j]&&t[j]<)
{
s[++q]=mat2[j]; t[j]=k;
if(s[q]<)
for(p=j;p>=;j=p)
{
mat2[j]=k=t[j];p=mat1[k]; mat1[k]=j;
}
}
}
}
if(mat1[i]<)
{
i--,p=INF;
for(k=;k<=q;k++)
{
for(j=;j<n;j++)
if(t[j]<&&a[s[k]]+b[j]-Map[s[k]][j]<p)
p=a[s[k]]+b[j]-Map[s[k]][j];
}
for(j=;j<n;j++) b[j]+=t[j]<?:p;
for(k=;k<=q;k++) a[s[k]]-=p;
}
}
for(i=;i<m;i++) ans+=Map[i][mat1[i]];
return ans;
}
void init()
{
for(int i=;i<N;i++)
for(int j=;j<N;j++)
Map[i][j]=-INF;
}
int p[];
int main()
{
//freopen("test.txt","r",stdin);
int n,m,i,j,k,a,b,t;
while(scanf("%d",&n)!=EOF)
{
for(i=;i<n;i++) scanf("%d",&p[i]);
init();
t=;
for(i=;i<n;i++){
if(p[i]<=) continue;
for(k=p[i];k>;k--)
{
for(j=;j<n;j++){
if(!p[j]){
a=abs(j-i);
b=n-a;
a=min(a,b);
Map[t][j]=-a;
}
}
t++;
}
}
//for(i=0; i<t;i++){for(j=0;j<n;j++) printf("%d ",Map[i][j]);printf("\n"); }
printf("%d\n",-KM(t,n));
}
return ;
}
hdu2282 Chocolate 完美匹配 + 拆点的更多相关文章
- UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design
题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi ...
- UVALive 4043 Ants(二分图完美匹配)
题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...
- UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)
UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...
- HDU 3488 Tour (最大权完美匹配)【KM算法】
<题目链接> 题目大意:给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用.题目保证至少存在一个环满足条件. 解题分析: 因为要求 ...
- UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- hdu1853 Cyclic Tour 完美匹配 验证模版
题意: 给出n个城市和m条路,每个城市只能经过一次,想要旅游所有的城市,求需要的最小花费(路径的长度). 分析: 做题之前,首先要知道什么是完美匹配.不然题目做了却不知道为什么可以用这个方法来做.完美 ...
- 紫书 例题11-10 UVa 1349 (二分图最小权完美匹配)
二分图网络流做法 (1)最大基数匹配.源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向 边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数 ...
- 【uva 1349】Optimal Bus Route Design(图论--网络流 二分图的最小权完美匹配)
题意:有一个N个点的有向带权图,要求找若干个有向圈,使得每个点恰好属于一个圈.请输出满足以上条件的最小权和. 解法:有向圈?也就是每个点有唯一的后继.这是一个可逆命题,同样地,只要每个点都有唯一的后继 ...
- ZOJ-3933 Team Formation (二分图最佳完美匹配)
题目大意:n个人,分为两个阵营.现在要组成由若干支队伍,每支队伍由两个人组成并且这两个人必须来自不同的阵营.同时,每个人都有m个厌恶的对象,并且厌恶是相互的.相互厌恶的人不能组成一支队伍.问最多能组成 ...
随机推荐
- BZOJ [POI2004]PRZ 状压DP_二进制_骚操作
二进制就是比谁更sao... Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in"," ...
- Solr与Elasticsearch比较
Solr优点1.Solr有一个更大.更成熟的用户.开发和贡献者社区.2.支持添加多种格式的索引,如:HTML.PDF.微软 Office 系列软件格式以及 JSON.XML.CSV 等纯文本格式.3. ...
- 【codeforces 798B】Mike and strings
[题目链接]:http://codeforces.com/contest/798/problem/B [题意] 给你n个字符串; 每次操作,你可以把字符串的每个元素整体左移(最左边那个字符跑到最后面去 ...
- 【[Offer收割]编程练习赛15 C】过河问题
[题目链接]:http://hihocoder.com/problemset/problem/1516 [题意] [题解] 状态压缩DP+bfs 这个过河问题能用bfs来搞.涨知识了; 首先; 16个 ...
- Efficient ticket lock synchronization implementation using early wakeup in the presence of oversubscription
A turn-oriented thread and/or process synchronization facility obtains a ticket value from a monoton ...
- ps -ef与ps aux的区别
ps -ef与ps aux的区别 学习:http://www.linuxidc.com/Linux/2016-07/133515.htm ps aux可以查看其内存使用情况:
- <图形图像,动画,多媒体> 读书笔记 --- 录制与编辑视频
使用UIImagePickerController 进行录制 #import "ViewController.h" #import <MobileCoreServices/M ...
- 去掉文本框前后的空格(JS+JQuery)
表单验证时,需要去除文本框前后的空格才可以正确通过验证.以前看到过一句话:任何设计和代码都要对用户足够宽容. <input type="text" class="p ...
- 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)
所实现的循环单链表的结构例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill ...
- 热修复JSPatch之实战教程
接上篇<热修复JSPatch之接口设计>,在这篇文章主要给大家讲述一下怎样高速具备热修复能力,当然了假设有人有志于把JSPatch系统的学习,甚至用JSPatch进行开发的.就没有必要 ...