题意:

  有n个蚂蚁n棵树,蚂蚁与树要配对,在配对成功的一对之间连一条线段,要求所有线段不能相交。按顺序输出蚂蚁所匹配的树。

思路:

  这个题目真是技巧啊,不能用贪心来为每个蚂蚁选择最近的树,这样很可能是相交了的。

  整体最优能让每条线段不相交,证明:

  假设a1-b1与a2-b2相交。则dis(a1,b1)+dis(a2,b2)>=dis(a1,b2)+dis(a2,b1)。如果我们所决定的最优匹配是按照整体距离最短来匹配的,那么dis(a1,b1)+dis(a2,b2)必定小于dis(a1,b2)+dis(a2,b1),否则,与最优矛盾。推广到整个图就是匹配图中任意两个点都是最优的,否则我们一定可以用更优的方式来替代他们。而整体最优靠的是KM算法。注意到,本题是完全二分图。

  Tips:要选的是整体权值最小,只需要将边权置为距离相反数再跑KM算法即可。

 #include <bits/stdc++.h>
using namespace std;
const int N=;
int antx[N], anty[N], treex[N], treey[N];
double g[N][N]; //距离 inline double dis(int a,int b)
{
return sqrt((treex[a]-antx[b])*(treex[a]-antx[b])+(treey[a]-anty[b])*(treey[a]-anty[b]));
} int n;
double Lx[N], Ly[N], slack[N];
int girl[N];
int S[N], T[N]; bool DFS(int x)
{
S[x]=true;
for(int i=; i<=n; i++)
{
if(T[i]) continue;
double tmp=Lx[x]+Ly[i]-g[x][i];
if(tmp<1e-)
{
T[i]=true;
if(girl[i]== || DFS(girl[i]))
{
girl[i]=x;
return true;
}
}
else if(slack[i]>tmp)
slack[i]=tmp;
}
return false;
} void KM(int n)
{
for(int i=; i<=n; i++) //初始化工作
{
girl[i]=;
Lx[i]=-1e19;
Ly[i]=0.0;
for(int j=; j<=n; j++)
Lx[i]=max(Lx[i], g[i][j]);
}
for(int i=; i<=n; i++) //对于每个树
{
for(int j=; j<=n; j++) slack[j]=1e19;
while()
{
memset(S, , sizeof(S));
memset(T, , sizeof(T));
if( DFS(i) ) break; //找到匹配的蚂蚁 double d=1e19;
for(int j=; j<=n; j++) //找最小D
{
if(!T[j] && d>slack[j])
d=slack[j];
} for(int j=; j<=n; j++) //更新树
{
if(S[j])
Lx[j]-=d;
} for(int j=; j<=n; j++) //更新蚂蚁
{
if(T[j]) Ly[j]+=d;
else slack[j]-=d;
}
}
}
} int main()
{
freopen("input.txt", "r", stdin);
int k=;
while(~scanf("%d",&n))
{
if(k) printf("\n");
k++;
for(int i=; i<=n; i++)
scanf("%d%d", &antx[i], &anty[i]); //ant
for(int i=; i<=n; i++)
scanf("%d%d", &treex[i], &treey[i]); //apple tree for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
g[i][j]=-dis(i,j); KM(n);
for(int i=; i<=n; i++)
printf("%d\n", girl[i]); //ans为girl
}
return ;
}

AC代码

UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配,KM算法)的更多相关文章

  1. HDU_2255 二分图最佳完美匹配 KM匈牙利算法

    一开始还没看懂这个算法,后来看了陶叔去年的PPT的实例演示才弄懂 用一个lx[]和ly[]来记录X和Y集合中点的权值,有个定理是 lx[i]+ly[j]==w[i][j](边权值) 则该点是最佳匹配, ...

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

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

  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. UVA - 1045 The Great Wall Game(二分图最佳完美匹配)

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

  6. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

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

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

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

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

  9. 二分图最大权匹配——KM算法

    前言 这东西虽然我早就学过了,但是最近才发现我以前学的是假的,心中感慨万千(雾),故作此篇. 简介 带权二分图:每条边都有权值的二分图 最大权匹配:使所选边权和最大的匹配 KM算法,全称Kuhn-Mu ...

随机推荐

  1. HDU 2529 Shot (物理数学题)

    题目 解题过程: //物理数学题 #include<stdio.h> #include<string.h> #include<algorithm> using na ...

  2. 【剑指offer】和为S的连续整数序列

    找到所有和为S的连续整数序列,序列长度>=2 我的思路:数学法,限定首元素范围,计算序列长度. 书上解法:用small和big两个游标记录序列的开始和结束位置,调整游标. 我的解法: /* ​直 ...

  3. 有趣 GIF 动图集 - 仿佛每张小动图都诉说了一个小笑话或者小故事

    点这里 来自法国南特(Nantes)的 Guillaume Kurkdjian 目前还是个学生.Kurkdjian 擅长创作一些平面动态图像,这些有趣的小动图仿佛每张都诉说了一个小笑话或者小故事,像个 ...

  4. 怎样在VS2013/MFC中使用TeeChart绘图控件

    TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在V ...

  5. Javascript 正则表达式笔记

    \d 元字符 + 量词 \w 常用的字符a-zA-Z0-9 .除回车之外的字符 ?0-1个字符 量词 只有前面是元字符,才变现量词 * 0-n 量词 /^\d+$/ 以字符开头,义字符结尾 [0-9] ...

  6. DBCP参数介绍

    参数分步介绍1)数据库连接相关    username="v10"    password="v10"    driverClassName="ora ...

  7. (一)初探HTML!

    想自己动手做一个个人网站,因此,最近在自学PHP,主要看韩顺平老师的教学视频..将自己学习的点点滴滴记录在博客园,希望数月之后,自己可以熟练的运用PHP,也希望各位PHP高手们给予指点,不胜感激!! ...

  8. Eclipse Java EE 编译器设置JSP默认编码

    在windows-preferences-web-jsp files-encoding那里设置默认编码.如下图所示:

  9. java理论基础学习一

    java的最大优势是跨平台 java的版本和体系架构 1.J2EE   Java 2 Enterprise Edition 定位在服务器端的应用 2.J2SE   Java 2 Standard Ed ...

  10. lintcode: 生成括号

    生成括号 给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果. 样例 给定 n = 3, 可生成的组合如下: "((()))", "(()())&q ...