题意:

每个人对不同房有不同出价,就是就是怎样匹配卖房让收入达到最大。

思路:

建立二分图,一边为N家老百姓,还有一边为N间房子。对老百姓和房子之间估价建立一条有带权边。问题就转变为了再二分图中找出一个总权值最大的匹配,也就是加权二分图最佳匹配问题。

代码:

KM算法:

#include<iostream>
#include <cstdio>
#include <string.h>
#define inf 0x3f3f3f3f
#define N 310 using namespace std; int n,nx,ny; //nx,ny分别表示x集合和y集合的元素个数
int lx[N],ly[N],link[N],slack[N],visx[N],visy[N],w[N][N]; bool DFS(int x)
{
int y;
visx[x]=;
for(y=;y<=ny;y++)
{
if(visy[y]) continue;
int t=lx[x]+ly[y]-w[x][y];
if(t==)
{
visy[y]=;
if(link[y]==-||DFS(link[y]))
{
link[y]=x;
return true;
}
}
else if(slack[y]>t) //不在相等子图中slack 取最小的
slack[y]=t;
}
return false;
} int KM()
{
int i,j,x;
memset(link,-,sizeof(link));
memset(ly,,sizeof(ly));
for(i=;i<=nx;i++) //lx初始化为与它关联边中最大的
for(j=,lx[i]=-inf;j<=ny;j++)
if(w[i][j]>lx[i])
lx[i]=w[i][j];
for(x=;x<=nx;x++)
{
for(i=;i<=ny;i++)
slack[i]=inf;
while()
{
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
if(DFS(x)) break; //若成功(找到了增广轨),则该点增广完成,进入下一个点的增广
//若失败(没有找到增广轨),则需要改变一些点的标号,使得图中可行边的数量增加。
//方法为:将所有在增广轨中(就是在增广过程中遍历到)的X方点的标号全部减去一个常数d,
//所有在增广轨中的Y方点的标号全部加上一个常数d
int d=inf;
for(i=;i<=ny;i++)
if(!visy[i]&&d>slack[i])
d=slack[i];
for(i=;i<=nx;i++)
if(visx[i])
lx[i]-=d;
for(i=;i<=ny;i++) //修改顶标后,要把所有不在交错树中的Y顶点的slack值都减去d
{
if(visy[i]) ly[i]+=d;
else slack[i]-=d;
}
}
}
int ans=;
for(i=;i<=ny;i++)
if(link[i]>-)
ans+=w[link[i]][i];
return ans;
} int main()
{
int i,j;
while(cin>>n)
{
nx=ny=n;
memset(w,,sizeof(w));
for(i=;i<=n;i++)
for(j=;j<=n;j++)
scanf("%d",&w[i][j]);
int ans=KM();
cout<<ans<<endl;
}
return ;
}

最新文章

  1. .Net大文件上传(转--待验证)
  2. 代码中设置excel自定义格式为[红色]的处理方法
  3. android bin目录下的.ap_是神马文件?
  4. hdu 1568 Fibonacci 数学公式
  5. Firefox添加插件支持修改Headers
  6. UVA11401Triangle Counting(简单计数)
  7. TCP与UDP区别总结
  8. day 15 - 1 内置函数
  9. python中list操作方法
  10. img大小和background-size
  11. 10 个 MySQL 经典错误【转】
  12. linux 修改文件内容 vi命令
  13. ActiveMQ Message Groups
  14. express框架以及配置项
  15. 在kali linux之下 下载并解压的文件名呈现乱码 解决方案
  16. 练习Laravel Homestead的安装
  17. chrome浏览器的scrollTop问题
  18. UVA-1149 Bin Packing (贪心)
  19. oracle内部结构
  20. json-lib使用笔记

热门文章

  1. Apache访问控制
  2. BZOJ3786星系探索——非旋转treap(平衡树动态维护dfs序)
  3. android 让真机显示 DeBug Log调试信息
  4. [hdu3966]Aragorn&#39;s Story
  5. Python--Django学习笔记1
  6. A1081. Rational Sum
  7. A1095. Cars on Campus
  8. 【LOJ#10180】烽火传递 单调队列+dp
  9. 【POJ1961】最短周期串/最大周期 kmp
  10. JAVA过滤器的使用(Filter)