【POJ3565】ANTS

题意:平面上有2*n个点,N白N黑。为每个白点找一个黑点与之连边,最后所有边不交叉。求一种方案。

题解:KM算法真是一个神奇的算法,虽然感觉KM能做的题用费用流都能做~

本题用到的结论:当选出的点对之间的距离之和最小时,一定使所有边都不交叉

这个感觉很容易理解,自己画画图就能看出来,就是难想啊

然后跑最小权值匹配,方法是将边权都变成相反数,然后跑最大权值匹配

不知道为什么以前写的KM算法会TLE,将求temp的过程拿到主函数里就过了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int n;
int xa[110],ya[110],xb[110],yb[110],va[110],vb[110],from[110],sta[110];
double dis[110][110],la[110],lb[110],temp;
int dfs(int x)
{
va[x]=1;
for(int i=1;i<=n;i++)
{
if(!vb[i]&&fabs(la[x]+lb[i]-dis[x][i])<1e-6)
{
vb[i]=1;
if(!from[i]||dfs(from[i]))
{
from[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;i++) scanf("%d%d",&xa[i],&ya[i]);
for(i=1;i<=n;i++) scanf("%d%d",&xb[i],&yb[i]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dis[i][j]=-sqrt(1.0*(xa[i]-xb[j])*(xa[i]-xb[j])+(ya[i]-yb[j])*(ya[i]-yb[j]));
for(i=1;i<=n;i++)
for(j=2,la[i]=dis[i][1];j<=n;j++)
la[i]=max(la[i],dis[i][j]);
for(i=1;i<=n;i++)
{
while(1)
{
memset(va,0,sizeof(va));
memset(vb,0,sizeof(vb));
temp=99999999.999999;
if(dfs(i)) break;
for(j=1;j<=n;j++) if(va[j])
for(k=1;k<=n;k++) if(!vb[k])
temp=min(temp,la[j]+lb[k]-dis[j][k]);
for(j=1;j<=n;j++) if(va[j]) la[j]-=temp;
for(j=1;j<=n;j++) if(vb[j]) lb[j]+=temp;
}
}
for(i=1;i<=n;i++) sta[from[i]]=i;
for(i=1;i<=n;i++) printf("%d\n",sta[i]);
return 0;
}

最新文章

  1. mysql 列类型
  2. 【CodeVS 3290】【NOIP 2013】华容道
  3. JavaScript---Angular 和JQuery
  4. [转]关于int整形变量占有字节问题
  5. requirejs + vue 项目搭建
  6. input 属性
  7. SQLserver中小数点怎么自定义取的问题
  8. JavaJDBC整理
  9. WSGI 相关的东东(转载)
  10. 清理孤儿文件 clearing up outdated orphans
  11. Excel技巧--巧用差异化插入空行
  12. DNS Wildcard(DNS泛域名)
  13. VB6 对象库未注册问题
  14. C# MVC+EF—结构搭建
  15. winform中RichTextBox在指定光标位置插入图片
  16. 【jsp】详解JSP表达式语言(EL)
  17. Dubbo -- 系统学习 笔记 -- 示例 -- 分组聚合
  18. 关于如何使用Microsoft Word发博客
  19. sass与less
  20. js insertBefore

热门文章

  1. Linux系统里如何彻底的清空终端屏幕?
  2. 如果你写PHP, 请多注意自己是否有良好的习惯
  3. Atitit.js javascript异常处理机制与java异常的转换.js exception process Voae
  4. atitit.软件开发概念--过滤和投影 数据操作
  5. 高性能网络 | 你所不知道的TIME_WAIT和CLOSE_WAIT
  6. 自己定义TextView 调用ttf格式字体
  7. CXCommon.h工具类
  8. HotSpot模板解释器目标代码生成过程源码分析
  9. NSString (NSStringPathExtensions)
  10. 无需看到你的脸就能认出你——实现Beyond Frontal Faces: Improving Person Recognition Using Multiple Cues