题意:

一个平面上有n个黑色的点,n个白色的点,要求黑色的点与白色点之间一一配对,且线段之间不相交。

思路:

线段不相交并不好处理,想了很久想不出,所以看了蓝书的讲解。

一个很明显的结论是,不相交的线段一定比相交的线段短,如图:一个较为直观的例子。

由于点之间一一对应,所以肯定用二分图匹配,然后要使得所有线段之和最短,那么就是求一个带权最小匹配,上KM算法解决。

把所有的边权取负值,求最大匹配即可。

代码:

 #include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std; const int N = ; double mp[N][N]; struct node
{
double x,y;
node(double a,double b)
{
x = a;
y = b;
}
}; vector<node> nx,ny; bool vis_x[N],vis_y[N];
int match[N];
double lx[N],ly[N];
double slack[N];
int ma[N]; double cal(int i,int j)
{
double dx = pow(nx[i].x - ny[j].x,);
double dy = pow(nx[i].y - ny[j].y,); return sqrt(dx + dy);
} bool dfs(int u,int n)
{
vis_x[u] = ; for (int i = ;i < n;i++)
{
if (vis_y[i]) continue; double gap = lx[u] + ly[i] - mp[u][i]; //getchar(); //printf("%.6f %.6f %.6f %.6f\n",lx[u],ly[i],mp[u][i],gap); if (fabs(gap) < 1e-)
{
vis_y[i] = ; if (match[i] == - || dfs(match[i],n))
{
match[i] = u;
return true;
}
}
else
{
slack[i] = min(slack[i],gap);
}
} return false;
} void km(int n)
{
memset(ly,,sizeof(ly));
memset(match,-,sizeof(match)); for (int i = ;i < n;i++)
{
lx[i] = mp[i][]; for (int j = ;j < n;j++)
{
lx[i] = max(lx[i],mp[i][j]);
}
} for (int i = ;i < n;i++)
{
for (int j = ;j < n;j++) slack[j] = 1e15;
//printf("gg");
while ()
{
//printf("233");
memset(vis_x,,sizeof(vis_x));
memset(vis_y,,sizeof(vis_y)); if (dfs(i,n)) break; double d = 1e15; for (int j = ;j < n;j++)
{
if (!vis_y[j]) d = min(slack[j],d);
} for (int j = ;j < n;j++)
{
if (vis_x[j]) lx[j] -= d; if (vis_y[j]) ly[j] += d;
} //getchar(); //printf("%.6f **\n",d);
}
}
} int main()
{
int n;
int kase = ; while (scanf("%d",&n) != EOF)
{
if (kase++) printf("\n"); nx.clear();
ny.clear(); for (int i = ;i < n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y); nx.push_back(node(x,y));
} for (int i = ;i < n;i++)
{
double x,y;
scanf("%lf%lf",&x,&y); ny.push_back(node(x,y));
} for (int i = ;i < n;i++)
{
for (int j = ;j < n;j++)
{
mp[i][j] = -cal(i,j);
}
} km(n); for (int i = ;i < n;i++)
{
int a = i + ,b = match[i] + ;
ma[b] = a;
} for (int i = ;i < n;i++)
{
printf("%d\n",ma[i+]);
}
} return ;
}

uva 1411 Ants的更多相关文章

  1. UVA 1411 - Ants(二分图完美匹配)

    UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一 ...

  2. uva 1411 Ants (权值和最小的完美匹配---KM算法)

    uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...

  3. poj 3565 uva 1411 Ants KM算法求最小权

    由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图.这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案.为啥呢 ...

  4. 【uva 1411 Ants蚂蚁们】

    题目大意: ·给你一个n,表示输入n个白点和n个黑点(输入每一个点的坐标).现在需要将各个白点和各个黑点一一用线段连接起来,需要满足这些线段不能够相交. ·特色: 我们如何保证线段间不相交. ·分析: ...

  5. UVa 1411 Ants(分治)

    https://vjudge.net/problem/UVA-1411 题意:n只蚂蚁和n颗苹果树,一一配对并且不能交叉. 思路:这就是巨人与鬼的问题.用分治法就行了. #include<ios ...

  6. 【UVA 1411】 Ants (KM)

    Young naturalist Bill studies ants in school. His ants feed onplant-louses that live on apple trees. ...

  7. UVA 10714 Ants 蚂蚁 贪心+模拟 水题

    题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...

  8. Ants UVA - 1411(km板题竟然让我换了个板子)

    题意: 给出n个白点和n个黑点的坐标,要求用n条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段 解析: 带入负的欧几里得距离求就好了 假设a1-b1 与 ...

  9. uva 10714 Ants(贪心)

    题目连接:10714 - Ants 题目大意:一根棍子上有n只蚂蚁, 这些蚂蚁开始可以任意朝着一个方向移动一直走,向左或是向右,并且移动速度是相同的,但是一旦蚂蚁碰到迎面走来的另一只蚂蚁,那么这两只蚂 ...

随机推荐

  1. js正则《转载收藏》

    \:转义字符.'\\n'匹配\n ^:开始位置.'^[0-9]'匹配以数字开头的字符,可以匹配'88DC',不可匹配'DC88' $:结束位置.'[0-9]$'匹配以数字结尾的字符,可以匹配'ab12 ...

  2. Angular.js学习范例及笔记

    一.AngularJs 1.row in order.rows <ng-bind="row.name"> 2.ng-form <form action=" ...

  3. vuex入门

    安装&使用 npm install vuex --save 1 通过Vue.use()来使用: import Vue from 'vue' import Vuex from 'vuex' Vu ...

  4. redhat7.2静默安装Oracle11.2.0.4

    redhat7.2静默安装Oracle11.2.0.4我们将oracle安装到/opt/oracle目录下,后面的环境变量则以此为基础.一.设置主机hosts映射vi /etc/hosts[plain ...

  5. 总结linux路由技术

    Linux系统的route命令用于显示和操作IP路由表,要实现两个不同的网段之间的通信,需要一台连接两个网络的路由器,或者同时连接位于两个网络的网关来实现. 在Linux系统中,设置路由通常是为了解决 ...

  6. 在用jQuery时遇到的小问题

    1. class类名问题? 在我在class ='看看(2)' ,凡是这样的居然给自身加其他style样式,居然添加不上,后来改成其他类名不带括号里的,居然好了. 2. line-height 引入的 ...

  7. mysql新手入门随笔2

    17.创建表 CREATE TABLE tbname(columnname1 类型 约束条件, columnname2 类型 约束条件,-); 三大类型:数值型,时间日期型,字符串类型 六大约束条件: ...

  8. Java多线程:ThreadLocal

    一.ThreadLocal基础知识 ThreadLocal是线程的一个本地化对象,或者说是局部变量.当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的 ...

  9. /etc/nginx/nginx.conf配置文件详解

    user nginx; #数值和cpu核数个数一致worker_processes 8; #worker与cpu绑定 worker_cpu_affinity 0001 0010 0100 1000 1 ...

  10. .Net的垃圾回收机制(GC)之拙见——托管类型的垃圾回收

    各种语言的垃圾回收在IT界噪的沸沸扬扬,有极大的优化同时也有瓶颈. 而在.Net中的垃圾回收机制又是怎样的呢? 众所知周,.Net中的垃圾回收机制是由.Net Framework托管的,带给开发者最大 ...