HDU2282Chocolate(KM匹配)
来源:互联网 发布:广播电视台和广电网络 编辑:程序博客网 时间:2024/06/07 23:30
题意:n个盒子,盒子里有巧克力,每次可以把巧克力移动到相邻的位置盒子中,问最小移动的次数,使每个盒子的巧克力最多只有一个。
思路:建图,把需要移动的巧克力和空的盒子之间连边。
#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<set>#include<map>#include<string>#include<cstring>#include<stack>#include<queue>#include<vector>#include<cstdlib>#define lson (rt<<1),L,M#define rson (rt<<1|1),M+1,R#define M ((L+R)>>1)#define cl(a,b) memset(a,b,sizeof(a));#define LL long long#define P pair<int,int>#define X first#define Y second#define pb push_back#define fread(zcc) freopen(zcc,"r",stdin)#define fwrite(zcc) freopen(zcc,"w",stdout)using namespace std;const int maxn=505;const int inf=9999999;int w[maxn][maxn];int linker[maxn],lx[maxn],ly[maxn],slack[maxn];bool visx[maxn],visy[maxn];int nx,ny;bool dfs(int x){ visx[x]=true; for(int y=0;y<ny;y++){ if(visy[y])continue; int tmp=lx[x]+ly[y]-w[x][y]; if(tmp==0){ visy[y]=true; if(linker[y]==-1||dfs(linker[y])){ linker[y]=x; return true; } }else if(slack[y]>tmp){ slack[y]=tmp; } } return false;}int km(){ cl(linker,-1); cl(ly,0); for(int i=0;i<nx;i++){ lx[i]=-inf; for(int j=0;j<ny;j++)if(w[i][j]>lx[i]){ lx[i]=w[i][j]; } } for(int x=0;x<nx;x++){ fill(slack,slack+ny+1,inf); while(true){ cl(visx,false); cl(visy,false); if(dfs(x))break; int d=inf; for(int i=0;i<ny;i++)if(!visy[i]&&slack[i]<d){ d=slack[i]; } for(int i=0;i<nx;i++)if(visx[i]){ lx[i]-=d; } for(int i=0;i<ny;i++)if(visy[i])ly[i]+=d; else slack[i]-=d; } } int ans=0; for(int i=0;i<ny;i++)if(linker[i]!=-1){ ans+=w[linker[i]][i]; } return ans;}int a[maxn];inline int abs(int x){return x<0?-x:x;}int main(){ int n; while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ scanf("%d",&a[i]); } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ w[i][j]=-inf; } } nx=ny=0; for(int i=0;i<n;i++)if(a[i]>1){ for(int j=1;j<a[i];j++){//多出来的都要移动 for(int k=0;k<n;k++)if(a[k]==0){ w[nx][k]=-min(abs(i-k),n-abs(i-k)); } nx++; } } ny=n; printf("%d\n",-km()); } return 0;}
0 0
- HDU2282Chocolate(KM匹配)
- KM算法(最优匹配)
- KM算法(最优匹配)
- HDU3718Similarity(KM最大匹配)
- KM算法(最优匹配)
- 最佳匹配KM(kuhn-Munkres)算法
- poj 2195 KM算法(完备匹配)
- 最大权匹配算法(km)
- HDU 3488 Tour(KM完美匹配)
- HDU 3718 Similarity(KM最大匹配)
- HDU 2282 Chocolate(KM最大匹配)
- HDU2426 Interesting Housing Problem(KM匹配 )
- HDU3359 Special Fish (KM匹配)
- 二分图最大匹配(匈牙利KM)
- HDU1533Going Home(KM匹配之最小值匹配)
- KM算法(完备匹配下的最大权匹配)
- POJ_3565 Ants KM匹配
- KM匹配题集
- 类中包含几种成员,分别是什么?
- ROWID的含义与块地址rdba深入分析
- MySQL的Keepalived安装、配置、启动
- LeetCode之Find Minimum in Rotated Sorted Array II
- Axis2 Web服务配置文件services.xml详解
- HDU2282Chocolate(KM匹配)
- android常用权限命令
- ubuntu禁用笔记本触摸板
- 1058. A+B in Hogwarts (20):有疑惑-第三个测试点错误
- ebs知识点100题
- Cocos2d-x从入门到精通第五课《Cocos2d-x中的Node》
- 数据结构与算法分析Java版练习1.14
- shell生成随机文件名
- 关于测试