链接

可以看出蓝的之和一定比红的之和要大,也就是说符合条件的匹配一定是权值最小的,所以二分图的最佳完美匹配。。KM

 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 110
#define LL long long
#define INF 9999999999.0
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>;
struct point
{
int x,y;
//point(int x=0,int y=0):x(x),y(y){}
}p[N<<];
double dis(point a,point b)
{
return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y));
}
double dcmp(double x)
{
if(fabs(x)<eps) return ;
return x<?-:;
}
double w[N][N];
int n,link[N],x[N],y[N];
double lx[N],ly[N],slack[N],d;
bool match(int u)
{
x[u] = ;
for(int i = ; i <= n ; i++)
{
if(y[i]) continue;
double o = lx[u]+ly[i]-w[u][i];
if(dcmp(o)==)
{
y[i] = ;
if(!link[i]||match(link[i]))
{
link[i] = u;
return true;
}
}
else if(slack[i]>o) slack[i] = o;
}
return false;
}
void km()
{
int i,j;
for(i = ;i <= n ;i++)
lx[i] = -INF;
memset(ly,,sizeof(ly));
memset(link,,sizeof(link));
for(i = ; i <= n ;i++)
for(j = ; j <= n ;j++)
lx[i] = max(lx[i],w[i][j]);
for(i = ; i <= n ;i++)
{
for(j = ; j <= n;j++)
slack[j] = INF;
for(;;)
{
d = INF;
memset(x,,sizeof(x));
memset(y,,sizeof(y));
if(match(i)) break;
for(j = ; j <= n ;j++)
if(!y[j]&&d>slack[j]) d =min(d,slack[j]);
for(j = ;j <= n ;j++) if(x[j]){lx[j]-=d;}
for(j = ;j <= n ;j++) if(y[j]){ly[j]+=d;}
// else slack[j]-=d;
//cout<<",";
}
}
} int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
//init();
for(i = ; i <=n+n; i++)
scanf("%d%d",&p[i].x,&p[i].y);
for(i =; i <= n ;i++)
for(j = ; j <= n ; j++)
{
w[i][j] = -dis(p[i+n],p[j]);
}
km();
for(i = ; i <= n ;i++)
printf("%d\n",link[i]);
}
return ;
}

poj3565Ants(KM-几何与图论的结合)的更多相关文章

  1. poj3565Ants——KM算法

    题目:http://poj.org/problem?id=3565 首先,我们神奇地发现,没有相交边的匹配可以转化为距离和最小的匹配,所以可以使用KM算法求带权匹配: 要求的是距离和最小,所以把边权转 ...

  2. 图论补档——KM算法+稳定婚姻问题

    突然发现考前复习图论的时候直接把 KM 和 稳定婚姻 给跳了--emmm 结果现在刷训练指南就疯狂补档.QAQ. KM算法--二分图最大带权匹配 提出问题 (不严谨定义,理解即可) 二分图 定义:将点 ...

  3. 图论(KM算法,脑洞题):HNOI 2014 画框(frame)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABPoAAANFCAIAAABtIwXVAAAgAElEQVR4nOydeVxTV/r/n9ertaJEC4

  4. 图论(KM算法):COGS 290. [CTSC2008] 丘比特的烦恼

    290. [CTSC2008] 丘比特的烦恼 ★★★   输入文件:cupid.in   输出文件:cupid.out   简单对比 时间限制:1 s   内存限制:128 MB 随着社会的不断发展, ...

  5. 图论(二分图,KM算法):HDU 3488 Tour

    Tour Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  6. 图论:KM算法

    如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就 ...

  7. 图论--二分图最佳完美匹配(KM模板)

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; cons ...

  8. Arcgis 几何网络分析

    ArcGIS:网络分析(转)   由于之前对网络分析的理解有很多问题,所以在网上找了一些资料,这是其中一篇我觉得比较好的,所以就整理了一下,发到网上来,留个底吧,呵呵 注:关于几何网络的建立见前面的& ...

  9. POJ 3686 & 拆点&KM

    题意: 有n个订单,m个工厂,第i个订单在第j个工厂生产的时间为t[i][j],一个工厂可以生产多个订单,但一次只能生产一个订单,也就是说如果先生产a订单,那么b订单要等到a生产完以后再生产,问n个订 ...

随机推荐

  1. JavaEE基础(五)

    1.Java语言基础(数组概述和定义格式说明) A:为什么要有数组(容器) 为了存储同种数据类型的多个值 B:数组概念 数组是存储同一种数据类型多个元素的集合.也可以看成是一个容器. 数组既可以存储基 ...

  2. require()与 require_once()、 include与include_once()

  3. SQLServer学习笔记<> 表连接查询----交叉连接、内连接、左连接、右连接

    (1)交叉连接(cross join)即我们所说的笛卡尔积.查询出满足两张表所有的记录数,A(3条记录),B(9条记录),A*B(27条记录). 比如:雇员表(HR.employees)和货运公司(S ...

  4. Window下memcached安装与测试步骤

    如何在Window下memcached安装与测试步骤 工具/原料 电脑 memcached 软件 方法/步骤 软件包下载 下载Memercached For Windows:http://downlo ...

  5. python怎么装模块

    windows下 最简单的方法: File---Settings--Project  ---Project Interpreter 下----点击 +号,输入你需要安装的模块名,点击Install P ...

  6. ACM题目————网格动物

    Lattice animal is a set of connected sites on a lattice. Lattice animals on a square lattice are esp ...

  7. quick lua 3.3常用方法和学习技巧之functions.lua目录

    1.functions.lua (framework->functions.lua) 提供一组常用函数,以及对 Lua 标准库的扩展 1.printf 2.checknumber checkin ...

  8. SQL数据类型大全 《转自网络》

    数据类型是数据的一种属性,表示数据所表示信息的类型.任何一种计算机语言都定义了自己的数据类型.当然,不同的程序语言都具有不同的特点,所定义的数据类型的种类和名称都或多或少有些不同.SQLServer ...

  9. SIM卡应用-OPN,PLMN,SPN

    SIM卡应用 移动运营商已经将SIM卡用於很多不同的应用,下面列出了其中最主要的应 用∶ ·漫游应用∶确保手机可以在漫游之後选择缺省的运营商网络.一个SIM应用是可以在手机漫游到某个合作夥伴运营商网络 ...

  10. JAVA基础知识之JVM-——动态代理(AOP)

    代理模式简介 在很多场景下,我们想使用一个类(通常是接口)A时,并不是直接使用这个类,而是通过另外一个类B去调用A的方法,这里的类B就是一个代理类. 有很多场景都会用到这种方法,例如假如创建类A需要很 ...