poj3656
题解:
二分图最大匹配
根据三角形不等式
直接上最大匹配即可
注意编圈取相反数
代码:
#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的更多相关文章
随机推荐
- oracle 11g怎样配置才能连接远程数据库
打开所有程序->找到oracle-oradb11g-home1->Net Configuration Assistant,如图所示 选择本地网络服务名配置,点击下一步 选择添 ...
- cgwin的ssh错误解决办法
参考博客 http://hi.baidu.com/luckygirl/item/bd00a6d8a05c310d20e25039 方法一(推荐): 修改/etc/passwd文件,在其中加入 s ...
- 前端学习笔记之BOM和DOM
前言 到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互. 也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DO ...
- 20135320赵瀚青LINUX内核分析第三周学习笔记
赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...
- Java对map进行排序并生成序号
最近做的项目有这样一个需求:要求对map中的值进行排序并生成序号.如果值相等则序号不变:如果不相等序号为该数数值在所有元素中的索引.如下表所示: Key(String) Value(Float) Id ...
- Spring笔记2——Spring中Bean的装配
1.引言 Spring中,对象无需自己负责查找或创建与其关联的其他对象,而是由容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间的协作关系的行为通常称为装配(Wiring),这也是依赖注入 ...
- SublimeText2 编辑器使用小结
用SublimeText 2进行前端开发也有一段时间了,所谓“工欲善其事必先利其器”,前几日对照着网易课程又重新温习总结了一下有关SublimeText编辑器的使用方式,有所收获,在此进行一次小小的总 ...
- Docker-Compose 一键部署Ningx+.Net Core+Redis集群
在看该文章前,你需要对Docker有所了解. 1.创建WebApp应用程序 我使用的是.Net Core 1.0.1版本,创建一个MVC应用程序,并添加对Redis的引用.因为这些很基础,也很简单,这 ...
- Chrome好用的插件:WhatRuns 查看网站使用的技术
Chrome好用的插件:WhatRuns 查看网站使用的技术 这是一款免费的Chrome扩展程序,使用很简单. chrome安装这个插件之后,打开要检测的网站,然后点击WhatRuns 的图标,就开始 ...
- 2017 ACM/ICPC Asia 南宁区 L The Heaviest Non-decreasing Subsequence Problem
2017-09-24 20:15:22 writer:pprp 题目链接:https://nanti.jisuanke.com/t/17319 题意:给你一串数,给你一个处理方法,确定出这串数的权值, ...