题目链接: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. JAVA实体类不要使用基本类型,基本类型包含byte、int、short、long、float、double、char、boolean

    由于JAVA的基本类型会有默认值,例如当某个类中存在private  int age;字段时,创建这个类时,age会有默认值0.当使用age属性时,它总会有值.因此在某些情况下,便无法实现age为nu ...

  2. 文献综述二:UML技术在行业资源平台系统建模中的应用

    一.基本信息 标题:UML技术在行业资源平台系统建模中的应用 时间:2015 出版源:Hans汉斯 文件分类:uml技术的应用 二.研究背景 为方便行业人员高效率地搜集专业知识,实现知识的共享.采用计 ...

  3. 移动开发:Android官方提供的支持不同屏幕大小的全部方法

    转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/8830286 原文地址为:http://developer.android.com/ ...

  4. 负载均衡服务器中存在大量的TIME_WAIT怎么解决

    首先需要明白什么是TIME_WAIT.TIME_WAIT是在tcp断开连接时进行四次回收的时候,主动断开端在收到被动关闭端的FIN包并发送ACK包给被动关闭后进入的状态.这个状态默认情况下是2倍的MS ...

  5. Problem E: 积木积水 ——————【模拟】

    Problem E: 积木积水 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元 ...

  6. bzoj 4543: [POI2014]Hotel加强版

    Description 给出一棵树求三元组 \((x,y,z)\,,x<y<z\) 满足三个点两两之间距离相等,求三元组的数量 Solution 考虑暴力 \(DP\) 设 \(f[i][ ...

  7. C# 矩阵运算和一些基本的几何运算

    以前工作中写的,这里备个份,有可能用到 基本的矩阵运算类,测试20阶以内应该没啥问题,超过20阶不好使... /// <summary> /// 矩阵 异常 512索引 1024无解 20 ...

  8. 51nod 1597 有限背包计数问题 (背包 分块)

    题意 题目链接 Sol 不会做啊AAA.. 暴力上肯定是不行的,考虑根号分组 设\(m = \sqrt{n}\) 对于前\(m\)个直接暴力,利用单调队列优化多重背包的思想,按\(\% i\)分组一下 ...

  9. 隐藏 google 地图 Logo 隐藏 百度 地图 Logo

    Google 地图 var isFirstLoad=true; //地图瓦片加载完成之后的回调 google.maps.event.addListener(map, 'tilesloaded', fu ...

  10. 03_Redis数据类型(List)

    [List类型] Redis采用的是LinkedList. ArrayList: 数组存储.查询快,增删慢. LinkedList:链表存储.增删快,查询慢,查询两端快. Redis的list内部采用 ...