题意:让N只蚂蚁到一棵苹果树,给出N个蚂蚁和N棵苹果树的对应坐标,求权值就是求坐标点之间的距离表示,要求求出最小的距离!
思路:采用最大权完美匹配问题,但是现在这道题是求最小权值,可以将求得的坐标之间的距离取反,取反之后求最大权值就是最小的距离了。

最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法。当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配。此时问题就转化为二分图最大权完美匹配。

KM 算法核心为: 为每一点添加顶标, 在顶标的限制下用匈牙利算法处理出最大匹配数, 若最大匹配数 =n, 则达到最优解, 输出。否则修改
顶标, 再用匈牙利算法处理, 如此重复。

设二分图的两部分点集分别为 X={X1,X2,…,Xn}X={X1,X2,…,Xn} 和 Y={Y1,Y2,…,Ym}Y={Y1,Y2,…,Ym}, ⟨Xi,Yj⟩⟨Xi,Yj⟩ 的边权为 wij
给两部分点集分别赋点权 {Ai},{Bi}{Ai},{Bi}, 使得 Ai+Bj⩾wij,取等的边的生成子图叫做相等子图。那么相等子图的完美匹配就是最大权匹配。我们需要适当选取权值,使相等子图有完美匹配。
算法步骤:
1.若成功(找到了增广轨),则该点增广完成,进入下一个点的增广
2.若失败(没有找到增广轨),则需要改变一些点的标号,使得图中可行边的数量增加。
操作为:将所有在增广轨中(就是在增广过程中遍历到)的X方点的标号全 部减去一个常数d,所有在增广轨中的Y方点的标号全部加上一个常数d

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#include<iomanip>
#include<cstdio>
#define esp 1e-6
using namespace std;
const int maxx=105;
const int maxn=10005;
const int inf=0x3f3f3f3f;
double lx[maxx],ly[maxx];
int visx[maxx],visy[maxx];
double w[maxx][maxx];
int linker[maxx];
double slack[maxx];
int n,m,k;
struct node{double x,y;
}num[maxx],e[maxx];
double Dist(node a,node b){double x=a.x-b.x;double y=a.y-b.y;return sqrt(x*x+y*y);
}
void init(){memset(linker,0,sizeof(linker));memset(w,0,sizeof(w));
}
int Find(int x){visx[x]=1;for(int y=1;y<=n;y++){if(visy[y]==0){double temp=abs(lx[x]+ly[y]-w[x][y]);if(temp<=esp){visy[y]=1;if(linker[y]==0||Find(linker[y])){linker[y]=x;return 1;}}else{slack[y]=min(slack[y],temp);}}}return 0;
}
void KM(){memset(ly,0,sizeof(ly));for(int i=1;i<=n;i++){lx[i]=-inf;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(lx[i]<w[i][j]){lx[i]=w[i][j];}}}for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){slack[i]=inf;}while(true){memset(visx,0,sizeof(visx));memset(visy,0,sizeof(visy));if(Find(k))break;double d=inf;for(int i=1;i<=n;i++){if(visy[i]==0){d=min(d,slack[i]);}}for(int i=1;i<=n;i++){if(visx[i]==1)lx[i]-=d;if(visy[i]==1)ly[i]+=d;else{slack[i]-=d;}}}}
}
int main(){while(scanf("%d",&n)!=EOF){init();for(int i=1;i<=n;i++){scanf("%lf %lf",&num[i].x,&num[i].y);}for(int i=1;i<=n;i++){scanf("%lf %lf",&e[i].x,&e[i].y);}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){w[i][j]=-1.0*Dist(num[i],e[j]);}}KM();int t[maxx];memset(t,0,sizeof(t));for(int i=1;i<=n;i++){t[linker[i]]=i;}for(int i=1;i<=n;i++){cout<<t[i]<<endl;}}return 0;
}

poj3565(最大权完美匹配)相关推荐

  1. poj2195(最大权完美匹配)

    题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:采用最大权完美匹配 最大权完美匹配:二分图最大匹 ...

  2. HDU3718(最大权完美匹配)

    题意:先给出N个字母,代表要标签:再给出M行,和第一行给出的N个标签进行匹配,之间的差代表权值.最后的相似度为最大权值为ans*1.0/n. 最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算 ...

  3. HDU3488(最大权完美匹配)

    题意:有N个城市M单程公路将它们连接起来:要求路路应该包含一个或多个循环a->B->-->p->A.每个城市都应该走一条路,在一条线路上,每个城市只需要访问一次,也就是一个城市 ...

  4. HDU2853(最大权完美匹配)

    题意:要求改动公司数量最少并且效率最大(效率最大也就是最大完美匹配) 其中有一个最大的问题就是最少改变公司数量(也就是最少改变多少条边) 这个知识点我也是看了网上的,关于这个知识点我也感觉很神奇.除了 ...

  5. 模板 - KM算法(O(n^3))(二分图最大权完美匹配)

    整理的算法模板合集: ACM模板 题目描述 给定一张二分图,左右部均有 n 个点,共有 m 条带权边,且保证有完美匹配. 求一种完美匹配的方案,使得最终匹配边的边权之和最大. //Data const ...

  6. poj3686(最小权值完美匹配)

    开始理解的有点简单了,也是看了其他的博客之后发现问题的: 题意:因为每一个物件都是受前一个物件的时间限制,所以假设某台机器加工了k个订单,那么用时为t1 + (t1 + t2) + (t1 + t2 ...

  7. HDU1533(最小权完美匹配)

    题意:m表示人,H表示房子,一个人只能进一个房子,一个房子也只能进去一个人,房子数等于人数,现在要让所有人进入房子,求所有人都进房子最短的路径. 思路:平时使用都是最大权完美匹配,现在这道题要求最小权 ...

  8. HDU2255(最全权完美匹配)

    最大权完美匹配:二分图最大匹配是寻找最大匹配数,用匈牙利算法.当连 接的边带有权值时,要寻找匹配后权值和最大的方案,且保证 A 集合中的点均有 B 中的点能匹配.此时问题就转化为二分图最大权完美匹配. ...

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

    恰好属于一个圈,那等价与每个点有唯一的前驱和后继,这让人想到了二分图, 把一个点拆开,点的前驱作为S集和点的后继作为T集,然后连边,跑二分图最小权完美匹配. 写的费用流..最大权完美匹配KM算法没看懂 ...

最新文章

  1. 使用VAE、CNN encoder+孤立森林检测ssl加密异常流的初探——真是一个忧伤的故事!!!...
  2. Google回归中国对SEO们意味着什么
  3. web项目怎么打包上线_高级前端web工程师简历范文,【工作经历+项目经验+自我评价】怎么写...
  4. 解决Button自动刷新页面的问题
  5. 使用JBoss EAP 7的HTTP / 2
  6. mysql select 效能_MYSQL的联合查询最好是少用,效能差异巨大
  7. php pdo-insert,php mysql pdo insert multiple rows 批量插入
  8. Nagios社区真有意思
  9. Visual C++ 6.0的三个问题---尚未完成安装 MSDEV.EXE 应用程序错误 缺少动态链接库文件
  10. Listary——好用到哭的高效快速搜索工具
  11. oracle添加redo,添加redolog组成员
  12. 电脑如何设置定时任务、定时执行 —— 不用Windows任务计划程序,也能轻松设定计划任务、定时任务 —— 定时执行专家
  13. 贰贰许远东在浙江省社科联学术年会上关于“中小企业数字化之路”的分享
  14. 获取非行间样式和行间样式方法
  15. 跃迁-功利心的学习方法,学的更好,学的更少
  16. vue3语法糖父子组件的通信
  17. 媒体查询、px和rem转换、浏览器兼容、手机端视频播放解决方案
  18. 下拉列表之前后端交互
  19. Mule学习-简单示例
  20. 十大管理之项目成本管理知识点

热门文章

  1. 交换数字(不用临时变量)
  2. 创建Django项目和模型(创建工程、子应用、设置pycharm环境、使用Django进行数据库开发的步骤)
  3. 电路交换-报文交换-分组交换- 分组交换包括:虚电路和数据报
  4. 网络工程师_要记录下来的一些题_4
  5. 是时候了解下无监督学习了!
  6. 感知机算法分类原理学习笔记
  7. OpenCV中的透视变换介绍
  8. 干货 | 循环神经网络LSTM的数学过程
  9. Mybatis之通用Mapper使用
  10. Docker系列教程09-使用Docker Hub管理镜像