首先黑点和白点是组成一个二分图这毫无疑问

关键是题目中要求的所有黑白配的线不能交叉。。。一开始我也没想到这个怎么转化为二分图里面的算法。

后来看书才知道,如果两两交叉,则可以把两根线当四边形的对角线,连四边形的两条边,则肯定不交叉,而且一个很明显的特征是,不交叉的两条线的他们的长度和 一定比交叉线的长度和小。

于是我们只要求出最小长度的线,就必定是不相交的。那就要用到最佳完美匹配了,首先算出两两点的欧几里得距离,然后取负数,这样走一遍匹配,得到的必定是最短的欧几里得距离,即不相交的线

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
struct node
{
int x,y;
} n1[],n2[];
int n,S[],T[],lefts[],rights[];
double w[][],lx[],ly[]; bool eq(double a, double b) {
return fabs(a-b) < 1e-;
} bool dfs(int u)
{
S[u]=;
for (int v=;v<=n;v++)if(eq(lx[u]+ly[v],w[u][v]) && !T[v]){
T[v]=;
if (!lefts[v]|| dfs(lefts[v])){
lefts[v]=u;
rights[u]=v;
return true;
}
}
return false;
}
void up()
{
double a=1e30;
for (int i=;i<=n;i++) if (S[i])
for (int j=;j<=n;j++) if (!T[j])
{
a=min(a,lx[i]+ly[j]-w[i][j]);
}
for (int i=;i<=n;i++){
if (S[i]) lx[i]-=a;
if (T[i]) ly[i]+=a;
}
}
void KM()
{
int i,j;
for (i=;i<=n;i++){
lefts[i]=lx[i]=ly[i]=;
for (j=;j<=n;j++){
lx[i]=max(lx[i],w[i][j]);
}
}
for (i=;i<=n;i++){
for (;;){
memset(S,,sizeof S);
memset(T,,sizeof T);
if (dfs(i)) break; else up();
}
}
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
for (int i=;i<=n;i++) scanf("%d%d",&n1[i].x,&n1[i].y);
for (int i=;i<=n;i++) scanf("%d%d",&n2[i].x,&n2[i].y);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++){
w[i][j]=(double)(n1[i].x-n2[j].x)*(n1[i].x-n2[j].x)+(double)(n1[i].y-n2[j].y)*(n1[i].y-n2[j].y);
w[i][j]=-sqrt(w[i][j]);
}
KM();
for (int i=;i<=n;i++)
printf("%d\n",rights[i]);
}
return ;
}

最新文章

  1. spring MVC入门教程
  2. 开发一个简单的python计算器
  3. 解决zookeeper报错[NIOServerCxn.Factory:0.0.0.0/0.0.0.0:2181:NIOServerCnxn@362] - Exception causing close
  4. Eclipse 无线调试(利用ADB工具)
  5. JZOJ 1312:关灯问题
  6. [转]Linux下的lds链接脚本详解
  7. JavaEE基础(十六)/集合
  8. Photoshop Cs5 64位系统破解版下载(内含破解方法)
  9. iOS面试题6.30总结
  10. ASP.NET 实现PDF文件下载
  11. Math.random与java.util.Random的差别
  12. (二十一)unity4.6学习Ugui中文文档-------交互-Supported Events &amp;amp; Raycasters
  13. ajax发送异步请求
  14. python不使用第三方变量,交换两个变量的值
  15. winform音频播放器(有声小说[凡人修仙传])
  16. Caused by: The Result type [json] which is defined in the Result annotation on the class
  17. Lodop在页面获取打印机列表 选择打印机预览
  18. BZOJ4714 : 旋转排列
  19. BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库
  20. unbind() 移除事件内处理方法

热门文章

  1. 使用EasyUI中Tree
  2. 记一次菜鸡的低级折腾--WordPress get Webshell(后台文件编辑插马)
  3. CodeForces - 876B Divisiblity of Differences
  4. ReadAsm2
  5. vue使用videojs控制后台m3u8数据请求
  6. R 对数变换 《回归分析与线性统计模型》page103
  7. DOM基础2——元素
  8. mysql 结果排序入门
  9. 初识python 廖雪峰(慕课网)
  10. 吴裕雄--天生自然java开发常用类库学习笔记:foreach及Enumeration接口