题解:

二分图最大匹配

根据三角形不等式

直接上最大匹配即可

注意编圈取相反数

代码:

#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. 利用page_source抓取网页中的URL,进行链接测试

    selenium的page_source方法可以获取到页面源码,下面就把它应用到链接测试中. # coding:utf-8 __author__ = 'helen' import re,request ...

  2. Safari中的input、textarea无法输入的问题

    原因是这两种表单元素上应用了user-select:none的css属性.一般没人刻意这么做,可能是这样的情况: * { user-select: none; } 在css中排除掉这两种元素就好了: ...

  3. iOS 性能监测

    给些链接: http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ%3D%3D&idx=1&mid=207890859&scene=23& ...

  4. C++MFC之picture control控件铺满图片

    UpdateData(true); //更新路径公共变量     CString m_path = m_edit1.GetString();      if(m_path=="") ...

  5. 在VS2012中采用C++中调用DLL中的函数(4)

    转自:http://www.cnblogs.com/woshitianma/p/3683495.html 这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天 ...

  6. 巨坑:jqgrid竟然取不到编辑模式下input的值

    今天遇到最奇葩的问题,竟然取不到input的值,感觉世界观都颠覆了.后来一搜资料,又是jqgrid框架搞的鬼,真搞不明白,开发框架就好好开发框架,留这么多坑有意思吗? jqgrid编辑模式下不要调用g ...

  7. Java-JVM调优常见配置举例

    常见配置举例 堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统 下,一般限制在1.5G~ ...

  8. Java-Minor GC、Major GC、Full GC

    Minor GC: 回收年轻代(Young)空间,包括Eden区.Survivor区. JVM无法为一个新对象分配空间时,比如eden区满了,就会触发Minor GC. Major GC: 清理永久代 ...

  9. 照着官网来安装openstack pike之glance安装

    镜像服务image service(glance)的安装还是在控制节点上进行: 1.前提条件,数据库为glance创建库和账户密码来连接数据库 # mysql -u root -p MariaDB [ ...

  10. 20145313张雪纯 《Java程序设计》8周学习总结

    20145313张雪纯 <Java程序设计>8周学习总结 教材学习内容总结 java.util.logging包的优点在于提供了日志功能相关类与接口,不必额外配置日志组件就可以在标准jav ...