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

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

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

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

#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 ;
}

UVALive 4043 转化最佳完美匹配的更多相关文章

  1. UVaLive 4043 Ants (最佳完美匹配)

    题意:给定 n 个只蚂蚁和 n 棵树的坐标,问怎么匹配使得每个蚂蚁到树的连线不相交. 析:可以把蚂蚁和树分别看成是两类,那么就是一个完全匹配就好,但是要他们的连线不相交,那么就得考虑,最佳完美匹配是可 ...

  2. UVALive 4043 Ants(二分图完美匹配)

    题意:每个蚁群有自己的食物源(苹果树),已知蚂蚁靠气味辨别行进方向,所以蚁群之间的行动轨迹不能重叠.现在给出坐标系中n个蚁群和n棵果树的坐标,两两配对,实现以上要求.输出的第 i 行表示第 i 个蚁群 ...

  3. UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)

    UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...

  4. UVa 11383 少林决胜(二分图最佳完美匹配)

    https://vjudge.net/problem/UVA-11383 题意: 给定一个N×N矩阵,每个格子里都有一个正整数W(i,j).你的任务是给每行确定一个整数row(i),每列也确定一个整数 ...

  5. 【LA4043 训练指南】蚂蚁 【二分图最佳完美匹配,费用流】

    题意 给出n个白点和n个黑点的坐标,要求用n条不相交的线段把他们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接一条线段. 分析 结点分黑白,很容易想到二分图.其中每个白点对应一个X结 ...

  6. Ants(二分图最佳完美匹配)

    Ants Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6904   Accepted: 2164   Special Ju ...

  7. UVA - 1045 The Great Wall Game(二分图最佳完美匹配)

    题目大意:给出棋盘上的N个点的位置.如今问将这些点排成一行或者一列.或者对角线的最小移动步数(每一个点都仅仅能上下左右移动.一次移动一个) 解题思路:暴力+二分图最佳完美匹配 #include < ...

  8. Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)

    题意: 给定n个点的有向图问,问能不能找到若干个环,让所有点都在环中,且让权值最小,KM算法求最佳完美匹配,只不过是最小值,所以把边权变成负值,输出时将ans取负即可 这道题是在VJ上交的 #incl ...

  9. UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

随机推荐

  1. Lesson 1 Finding fossil man

    Why are legends handed down by storytellers useful? We can read of things that happend 5000 years ag ...

  2. i春秋-密码-IceCTF-Alien Message

    题目: 对应的解题图片: 解的时候,符号大点的是大写,小点的是小写. IceCTF{gOOd_n3wZ_3vERyoN3_1_L1k3_fU7ur4Ma_4nd_tH3iR_4maZ1nG_3As7e ...

  3. java表单基础

    一.表单  基本语法:   <form method="表单提交方式(post/get)" action="表单提交地址">       </ ...

  4. Django 利用第三方平台实现用户注册

    前言: 登陆和注册功能是一个功能比较完善的网站必备的功能,其中涉及的业务逻辑实用性较强,所以我将Django的注册功能进行了总结,希望可以帮助大家.我们这次使用的第三方短息平台是云通信,当然你可以用其 ...

  5. VMware导入和删除虚拟机文件

    VMware中导入已存在的虚拟机文件: 1.文件-->打开-->选择虚拟机文件-->完成     VMware中完全删除虚拟机文件 2.在虚拟机上右键单击-->管理--> ...

  6. 解决使用还原卡的PC在2个月后要重新加入域的问题

    客户端正确操作: 1. 启动注册表编辑器. 要这样做, 请依次单击 开始 . 运行 , 类型 regedit 在 打开, 框, 然后单击 确定 . 2. 找到并单击以下注册表子项: HKEY_LOCA ...

  7. Java笔记--枚举&注解

    1.自定义枚举类的实现,例: class Season{ //1,提供类的属性,声明为rivate final private final String name; private final Str ...

  8. java不要登录发送邮件noReply

    最近在工作中遇到一个问题: 客户需要让我们的系统给他们发邮件,但是不给我们提供用户密码. 这样就导致一个问题,即,一般我们使用的都是smtp方式发邮件,发邮件的时候必须登录,虽然可以修改发件人的邮箱名 ...

  9. 003.Delphi插件之QPlugins,菜单插件加强

    相比上一篇的菜单插件,这个在创建和销毁时候,做了增强,同时做了2个菜单对应的窗口 unit MenuSvc; interface uses windows, classes, SysUtils, Gr ...

  10. 03.Delphi通过接口实现多重继承的优化

    在上一篇02中,写到的sayhello函数,需要使用2个接口参数,很繁琐.可以使用as参数,把多重继承的子类对象变成需要的对象 uSayHello代码如下 unit uSayHello; interf ...