题目链接:https://vjudge.net/contest/161820#problem/A

题意: n 个 白点,n 个黑点,给出了坐标,求完美匹配后,各点不相交,输出白点对于的黑点编号;(输出输错了 (;´д`)ゞ)

分析:(a1-b1) (a2-b2)

如果这样连接,那么肯定大于 (a1-b2) (a2-b1);也就说,我们要的完美匹配要是权值最小的匹配;

这样,我们的权值,可以全改为负数,这样就可以转为普通的KM算法了;

KM算法(我的理解):

  可行标  lx(i) + ly(j)>=w(i,j),当完全子图中的 所有lx(i) + ly(j) ==w(i,j) 时,就有,这个子图是最大权匹配的完美匹配(最佳完美匹配);

  怎么得到可行标呢? 初始化话所有X是邻接阵里面最大的那一条,然后在匈牙利树上找,不断的扩充这个匈牙利树,直到成为一个完全子图;

  怎么扩充匈牙利树呢? 每次在S,T' 中找最小的一个lx(x) + ly(y) -w(x,y),去修改原来的匈牙利树,使得有可能有新的边加进来;

 #include <bits/stdc++.h>

 using namespace std;
#define esp 1e-10
const double inf = 1e20;
const int maxn = ;
int n;
double W[maxn][maxn];
double Lx[maxn],Ly[maxn];
int lefts[maxn];
bool S[maxn],T[maxn]; bool match(int i) {
S[i] = true;
for(int j=;j<=n;j++)
{
if(fabs(Lx[i]+Ly[j]-W[i][j])<esp&&!T[j]) {
T[j] = true;
if(!lefts[j]||match(lefts[j])) {
lefts[j] = i;
return true;
}
}
}
return false;
} void update() {
double a = inf;
for(int i=;i<=n;i++) if(S[i])
for(int j=;j<=n;j++) if(!T[j])
a = min(a,Lx[i]+Ly[j]-W[i][j]); for(int i=;i<=n;i++) {
if(S[i]) Lx[i]-=a;
if(T[i]) Ly[i]+=a;
}
} void KM() {
for(int i=;i<=n;i++) {
lefts[i] =;
Ly[i] = ;
Lx[i] = -inf;
for(int j=;j<=n;j++) {
Lx[i] = max(Lx[i],W[i][j]);
}
} for(int i=;i<=n;i++) {
for(;;) {
for(int j=;j<=n;j++)
S[j] = T[j] = ;
if(match(i))
break;
else update();
}
}
} struct Point {
double x,y;
}points[maxn]; int main()
{
while(scanf("%d",&n)!=EOF) {
for(int i=;i<=*n;i++)
scanf("%lf%lf",&points[i].x,&points[i].y); for(int i=;i<=n;i++) {
double x1 = points[i].x;
double y1 = points[i].y; for(int j=n+;j<=*n;j++) {
double x2 = points[j].x;
double y2 = points[j].y;
W[j-n][i] = -sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
} KM(); for(int i=;i<=n;i++)
printf("%d\n",lefts[i]); }
return ;
}

LA 4043 最优匹配的更多相关文章

  1. poj 2195 二分图最优匹配 或 最小费用最大流

    就是最基本的二分图最优匹配,将每个人向每个房子建一条边,权值就是他们manhattan距离.然后对所有权值取反,求一次最大二分图最优匹配,在将结果取反就行了. #include<iostream ...

  2. 51nod 算法马拉松4 D装盒子(网络流 / 二分图最优匹配)

    装盒子   基准时间限制:1 秒 空间限制:131072 KB 分值: 160 有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放.注意一个盒子只可以套入长和宽分别不小于它的盒子,并且 ...

  3. hdu2255 奔小康赚大钱 km算法解决最优匹配(最大权完美匹配)

    /** 题目:hdu2255 奔小康赚大钱 km算法 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 题意:lv 思路:最优匹配(最大权完美匹配) ...

  4. POJ 2516 Minimum Cost (KM最优匹配)

    题意:有N家家店,每家店都对K种货物有需求:同时有M家仓库,对K钟货物有供应.对于每种货物,每个仓库送至每家店都有自己的单位费用.求满足所有店所有货物的最小费用 分析:对于每一种货物,如果总需求大于总 ...

  5. HDU - 3488 Tour (KM最优匹配)

    题意:对一个带权有向图,将所有点纳入一个或多个环中,且每个点只出现一次,求其所有环的路径之和最小值. 分析:每个点都只出现一次,那么换个思路想,每个点入度出度都为1.将一个点拆成两个点,一个作为入度点 ...

  6. 训练指南 UVALive - 4043(二分图匹配 + KM算法)

    layout: post title: 训练指南 UVALive - 4043(二分图匹配 + KM算法) author: "luowentaoaa" catalog: true ...

  7. [hdu2255]奔小康赚大钱(二分图最优匹配、KM算法)

    题目大意:求二分图的最优匹配(首先数目最大, 其次权值最大). 解题关键:KM算法 复杂度:$O(n^3)$ #include<cstdio> #include<cstring> ...

  8. Opencv Surf算子特征提取与最优匹配

    Opencv中Surf算子提取特征,生成特征描述子,匹配特征的流程跟Sift是完全一致的,这里主要介绍一下整个过程中需要使用到的主要的几个Opencv方法. 1. 特征提取 特征提取使用SurfFea ...

  9. poj 3565 二分图最优匹配

    思路: 将ant与tree之间用距离来做权值,求最小权匹配就可以了.可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小. 就像斜边永远比直角边长一样的道理. # ...

随机推荐

  1. vue2.0 在main.js引入scss文件报错

    在vue2.0的main.js中引入scss文件报错 原因是在 在build文件夹下的webpack.base.conf.js的rules里面添加配置 { test: /\.scss$/, loade ...

  2. vue项目echarts画布删除历史数据重新渲染数据

    vue用到echarts时,根据select多选下拉框进行echarts折线图渲染.发现折现只能增加不能减少,后来根据echarts API文档发现 调用方式: chart.setOption(opt ...

  3. 剑指offer第3题:从尾到头打印链表

    方法一:采用栈来存储,用ArrayList保存.注意题目给出的输出结果是ArrayList import java.util.ArrayList; import java.util.Stack; pu ...

  4. Docker原理(开发技术分享转发)

    Docker原理Docker是啥Docker是一个程序运行.测试.交付的开放平台,Docker被设计为能够使你快速地交付应用.在Docker中,你可以将你的程序分为不同的 基础部分,对于每一个基础部分 ...

  5. 第十九章:UTC time和local time的互换

    通常我们服务器端的时间使用UTC格式,避免服务器的时区对最终的时间产生影响.而客户端需要根据具体的时区显示local time,本文将介绍如何将服务器的UTC time(基于asp.net web a ...

  6. 如何用webgl(three.js)搭建一个3D库房,3D密集架,3D档案室,-第二课

    闲话少叙,我们接着第一课继续讲(http://www.cnblogs.com/yeyunfei/p/7899613.html),很久没有做技术分享了.很多人问第二课有没有,我也是抽空写一下第二课. 第 ...

  7. JS常用的设计模式(6)——桥接模式

    桥接模式的作用在于将实现部分和抽象部分分离开来, 以便两者可以独立的变化.在实现api的时候, 桥接模式特别有用.比如最开始的singleton的例子. var singleton = functio ...

  8. 04.Path类的学习

    path 是路径的意思. path类是一个静态类,所以path是一个工具类. Path类是专门用来操作路径的. Path的常用方法: namespace _15.Path类的学习 { class Pr ...

  9. DJango小总结一

    views.py                        def func(request):                # 包含所有的请求数据                ...     ...

  10. C# 用tabcontrol实现窗体类似网页排版的显示

    这里做的比较简陋,可以美化下 把form设置为非顶级控件,直接放在tabcontrol里边,然后实现tabcontrol的拖拽移除tabpage显示form以及添加tabpage mousemove的 ...