题意:

  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 完美匹配 + 拆点的更多相关文章

  1. UVa 1349 (二分图最小权完美匹配) Optimal Bus Route Design

    题意: 给出一个有向带权图,找到若干个圈,使得每个点恰好属于一个圈.而且这些圈所有边的权值之和最小. 分析: 每个点恰好属于一个有向圈 就等价于 每个点都有唯一后继. 所以把每个点i拆成两个点,Xi  ...

  2. UVALive 4043 Ants(二分图完美匹配)

    题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...

  3. UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)

    UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...

  4. HDU 3488 Tour (最大权完美匹配)【KM算法】

    <题目链接> 题目大意:给出n个点m条单向边边以及经过每条边的费用,让你求出走过一个哈密顿环(除起点外,每个点只能走一次)的最小费用.题目保证至少存在一个环满足条件. 解题分析: 因为要求 ...

  5. UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  6. hdu1853 Cyclic Tour 完美匹配 验证模版

    题意: 给出n个城市和m条路,每个城市只能经过一次,想要旅游所有的城市,求需要的最小花费(路径的长度). 分析: 做题之前,首先要知道什么是完美匹配.不然题目做了却不知道为什么可以用这个方法来做.完美 ...

  7. 紫书 例题11-10 UVa 1349 (二分图最小权完美匹配)

    二分图网络流做法 (1)最大基数匹配.源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向 边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数 ...

  8. 【uva 1349】Optimal Bus Route Design(图论--网络流 二分图的最小权完美匹配)

    题意:有一个N个点的有向带权图,要求找若干个有向圈,使得每个点恰好属于一个圈.请输出满足以上条件的最小权和. 解法:有向圈?也就是每个点有唯一的后继.这是一个可逆命题,同样地,只要每个点都有唯一的后继 ...

  9. ZOJ-3933 Team Formation (二分图最佳完美匹配)

    题目大意:n个人,分为两个阵营.现在要组成由若干支队伍,每支队伍由两个人组成并且这两个人必须来自不同的阵营.同时,每个人都有m个厌恶的对象,并且厌恶是相互的.相互厌恶的人不能组成一支队伍.问最多能组成 ...

随机推荐

  1. jenkins+svn+tomcat部署war包

    svn是版本控制器,是提供一个版本库让程序员把项目提交上去,每一次更新代码提交后都会记录 jenkins是持续部署的工具,是让项目自动部署发布出去的工具,当项目代码发生改变时就需要重新打包成war包, ...

  2. springboot框架嵌入netty

    1.pom.xml添加依赖 <dependency> <groupId>io.netty</groupId> <artifactId>netty-all ...

  3. 【codeforces 483B】Friends and Presents

    [链接] 我是链接,点我呀:) [题意] [题解] 我们可以二分n的值,设为mid 那么对于n=mid 我们可以算出来以下3个东西 temp1 = n/x; temp2 = n/y; temp3 = ...

  4. 【hihocoder 1287】 数论一·Miller-Rabin质数测试

    [题目链接]:http://hihocoder.com/problemset/problem/1287 [题意] [题解] 取的底数必须是小于等于n-1的; 那12个数字能通过2^64以内的所有数字; ...

  5. 使用timthumb.php截取文章缩略图

    wordpress自带的缩略图功能会对每次上传的所有图片根据设置的图片尺寸进行裁剪,并把原图和裁剪后的图片保存在网站空间中,图片只裁剪一次,更改设置的尺寸不会重新生成,这样不仅占用主机空间,以后改版网 ...

  6. orcale 日期显示格式化

    SQL> select * 2 from emp 3 where hiredate='1987-11-17'; where hiredate='1987-11-17' * 第 3 行出现错误: ...

  7. Wireshark中的一些SNMP相关的过滤器

    Wireshark中的一些SNMP相关的过滤器 转自 http://linmingren2003.blog.163.com/blog/static/567510032011419825097/   由 ...

  8. ASP.NET--MVC--伪静态

    原文地址 以前伪静态很流行主要是为了SEO优化排名,现在搜索引擎对静态网站和动态网站的权重差不多了,就没有必要再伪静态了,个人意见,仅供参考. 有些客户要求设置静态的,为了完成需求,而且更简单的做法就 ...

  9. Linux显示使用命令who(转)

    Linux who命令用于显示系统中有哪些使用者正在上面,显示的资料包含了使用者ID.使用的终端机.从哪边连上来的.上线时间.呆滞时间.CPU使用量.动作等等. 使用权限:所有使用者都可使用. 语法 ...

  10. impdp时卡住,DW等待library cache lock

    同事反映impdp时在SCHEMA_REPORT/TYPE/TYPE_SPEC步骤卡住,1个多小时后也没有响应, 查下v$session: select program,sid, event,bloc ...