题解:

二分图最大匹配

根据三角形不等式

直接上最大匹配即可

注意编圈取相反数

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=110;
const double INF=0xffffffffffff,eps=1e-6;
struct Node{double x,y;}Dot1[N],Dot2[N];
double Dist(Node a,Node b)
{
return -sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int n,NX,NY,link[N],visx[N],visy[N];
double Map[N][N],lx[N],ly[N],slack[N];
int FindPath(int u)
{
visx[u]=1;
for (int i=1;i<=NY;i++)
{
if (visy[i])continue;
double temp=lx[u]+ly[i]-Map[u][i];
if (fabs(temp)<=eps)
{
visy[i]=1;
if (link[i]==-1||FindPath(link[i]))
{
link[i]=u;
return 1;
}
}
else if (slack[i]>temp)slack[i]=temp;
}
return 0;
}
void KM()
{
memset(lx,0,sizeof(lx));
memset(ly,0,sizeof(ly));
memset(link,-1,sizeof(link));
for (int i=1;i<=NX;i++)
for (int j=1;j<=NY;j++)
if (Map[i][j]>lx[i])lx[i]=Map[i][j];
for (int i=1;i<=NX;i++)
{
for (int j=1;j<=NY;j++)slack[j]=INF;
while (1)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if (FindPath(i))break;
double d=INF;
for (int j=1;j<=NY;j++)
if (!visy[j]&&d>slack[j])d=slack[j];
for (int j=1;j<=NX;j++)
if (visx[j])lx[j]-=d;
for (int j=1;j<=NY;j++)
{
if (visy[j])ly[j]+=d;
else slack[j]-=d;
}
}
}
}
int main()
{
while (~scanf("%d",&n))
{
memset(Map,0,sizeof(Map));
for (int i=1;i<=n;i++)scanf("%lf%lf",&Dot1[i].x,&Dot1[i].y);
for (int i=1;i<=n;i++)scanf("%lf%lf",&Dot2[i].x,&Dot2[i].y);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)Map[i][j]=Dist(Dot1[i],Dot2[j]);
NX=NY=n;
KM();
for (int i=1;i<=N;i++)
for (int j=1;j<=N;j++)
if (link[j]==i)
{
printf("%d\n",j);
break;
}
}
return 0;
}

  

poj3656的更多相关文章

随机推荐

  1. NC二次开发常用的方法

    //这张表存放的是所有单据模板的信息表 如果不知道单据模板的信息后可在数据库中查询PUB_BILLTEMPLET//这张表是打印模板的表改模板可以再此表修改pub_print_template//获取 ...

  2. Spring AOP 的实现方式(以日志管理为例)

    一.AOP的概念 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充,流行的AOP框架有Sping AOP.Aspect ...

  3. Hive的静态分区和动态分区

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl/p/6831884.html 转载请注明出处 虽然之前已经用过很多次hive的分区表,但是还是找时间快速回顾总结 ...

  4. hTML5 多图上传预览

    <p> <label>请选择一个文件:</label> <input type="file" id="file" mu ...

  5. RedisTemplate访问Redis数据结构

    https://www.jianshu.com/p/7bf5dc61ca06 Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字 ...

  6. genisoimage命令用法

    功能说明:建立ISO 9660映像文件.  常用命令:genisoimage -o imagename.iso file 语 法:mkisofs [-adDfhJlLNrRTvz][-print-si ...

  7. 在VS2015中用C++编写可被其它语言调用的动态库DLL

    转自:http://blog.csdn.net/songyi160/article/details/50754705 VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015>文件 ...

  8. 前端学习笔记之BOM和DOM

    前言 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...

  9. Python面试题之多个装饰器执行顺序

    疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子: def decorator_a(func): print 'Get in decorator_a' def ...

  10. 解决 maven项目在eclipse中debug时看不到源码问题

    第一步: 第二步:Configurations 里面的source里面是Default.把Defaul删除,选java project ,然后添加自己的项目 第三步:选中,并用命令跑tomcat 这样 ...