poj3565 Ants(二分图最小权匹配,KM算法)

二分图的最大权匹配(最小权匹配)KM算法 如果二分图的每条边都有的一个权值,如何求出权值和最大(最小) 阅读详情

http://poj.org/problem?id=3565

题意:给你n的蚂蚁的坐标和n和苹果的坐标,要你匹配它们,一个要求是它们各自匹配所构成的线段不相交,

题解: 有三角形俩边之和大于第三边可以得到他们连线的所有线段和最小的时候线段一定不会相交。
所以这个题目就转化为二分图最小权匹配,把俩点距离堪称权值,套下KM算法就ok了

#include <iostream>
#include <cstring>
#include <cstdio>
#include<cmath> 
using namespace std;
const int MAXN = 115; 
double eps = 1e-6;
const double INF = 0x3f3f3f3f;

double dis[MAXN][MAXN];   
double ex_bai[MAXN];      
double ex_hei[MAXN];       
bool vis_hei[MAXN];    
bool vis_bai[MAXN];     
int match[MAXN];        
double slack[MAXN];        
int N;

struct node{
	int x, y;
}ant[MAXN],apple[MAXN];
 
 double min(double a,double b)
{
	return a<b?a:b;
} 
double max(double a,double b)
{
 	return a>b?a:b;
}
bool dfs(int hei)
{
    vis_hei[hei] = true;

    for (int bai = 1; bai <= N; ++bai) {

        if (vis_bai[bai]) continue; 

        double  gap = ex_hei[hei] + ex_bai[bai] - dis[hei][bai];
        if (fabs(gap)<=1e-6) {  // 如果符合要求
            vis_bai[bai] = true;
            if (match[bai] == -1 || dfs( match[bai] )) {   
                match[bai] = hei;
                return true;
            }
        } else {
            slack[bai] = min(slack[bai], gap);  
        }
    }

    return false;
}

void KM()
{
    memset(match, -1, sizeof (match));    
    memset(ex_bai, 0, sizeof (ex_bai));   


    for (int i = 1; i <= N; ++i) {
        ex_hei[i] = -INF;		//最小值这个时候不能是0了,而是-INF
        for (int j = 1; j <= N; ++j) {
            ex_hei[i] = max(ex_hei[i], dis[i][j]);
        }
    }

    for (int i = 1; i <=N; ++i) {

        fill(slack+1, slack + N+1, INF);    // 因为要取最小值 初始化为无穷大

        while (1) {
        	
            memset(vis_hei, false, sizeof vis_hei);
            memset(vis_bai, false, sizeof vis_bai);

            if (dfs(i)) break;  // 找到归宿 退出

            // 如果不能找到 就降低期望值
            // 最小可降低的期望值
            double d = INF;
            for (int j = 1; j <=N; ++j)
                if (!vis_bai[j]) d = min(d, slack[j]);

            for (int j = 1; j <=N; ++j) {
                
				if (vis_hei[j]) ex_hei[j] -= d;

                if (vis_bai[j]) ex_bai[j] += d;
            
                else slack[j] -= d;
            }
        }
    }
}

double dist(int i,int j)
{
	double x=sqrt((ant[i].x-apple[j].x)*(ant[i].x-apple[j].x)+(ant[i].y-apple[j].y)*(ant[i].y-apple[j].y));
	return x;
}
int main()
{
 		scanf("%d",&N);
		for(int i=1;i<=N;i++)
		{
			scanf("%d %d",&ant[i].x,&ant[i].y);	
		}
		for(int i=1;i<=N;i++)
		{
			scanf("%d %d",&apple[i].x,&apple[i].y);
		}
		for(int i=1;i<=N;i++)
		{
			for(int j=1;j<=N;j++)
			{
				dis[j][i]=-dist(i,j);//取反
			//	printf("%.3lf ",dis[j][i]); 
			}
		}
		KM();
		for(int i=1;i<=N;i++)
		{
			printf("%d\n",match[i]);
		}
    return 0;
}
POJ 3565 Ants(二分图最小权完备匹配) 题意:给定平面上同样多的黑点和白点,要求输出一种方案使得所有匹配的点的连线两两不相交。 思路:构造一个二分图,黑点白点之间的边的权值为两点的欧几里得距离,那么问题就转化为了求二分图的最小权匹配。这是因为如果最小权匹配有两条线段相交,那么一定可以转化为两条不相交且总长度更短的两条线段,这与最小权矛盾,所以可以证明最小权匹配中没有相交的线段。 #include #include #include 阅读详情

相关推荐

km算法+slack优化 poj3565

km算法在百度上讲的很清楚讲一些针对这道题的有n只蚂蚁要吃n个苹果,求总路径和最小,且不交叉的方案网上有很多人说是计算几何题其实,研究一下题意可以得出很重要的性质————最优方案一定不交叉。根据三角形不等式adad+bc因此,我们只需要构造二分图,求最小权和匹配将所有蚂蚁看做一个集合,所有苹果看做一个集合,求出各蚂蚁到各苹果的距离并取反,在这个二分图上用km算法容易发现这个模型是完全二分图,因此,加上slack优化可以快很多(在其他情况下slack优化一般只优化常数)。这道题的相等判断要注意精度,否则会死循

huyuncong的专栏 3421

二分图大合集——二分图最大匹配(最小覆盖数),完美匹配以及最优匹配(带权最大匹配) (转载)

转载一位博主的文章:传送门

zamaochick的博客 291

KM算法(DFS版,优化DFS版,BFS版)

KM算法主要用于二分图的最大权匹配问题 图解 模板 如果我们要求边权值最小的匹配可以把边权值取负值,得出结果后再取相反数即为答案。 KM算法各版本模板: dfs版KM算法模板O(n4)复杂度 图解+模板 题集 对访问过且匹配过的男生,期望值要加上女生减去的期望值;代码中的未访问过的男生实际上包含两种,一种是完全没被访问过的(slack[ j ] = INF),一种是访问过,且更新过slack值但没有参与匹配的男生,由于这种男生可匹配的部分女生期望值降低,所以该男生的slack值减少。 HDU 2255 模板

h_bby的博客 3020

二分图大合集——二分图最大匹配(最小覆盖数),完美匹配以及最优匹配(带权最大匹配)

二分图: 定义:二分图又称作二部图,是图论的一种特殊模型。设G=(V, E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A , B),且图中的每条边(i, j)所关联的两个定点分别属于这两个不同的顶点集(i in A, j in B),则称图G为一个二分图。 简单的说,一个图被分成了两部分,相同的部分没有边,那这个图就是二分图,二分图是特殊的图。(不含奇环) 由定义可知,二分图没有自...

ling_wang的博客 5万+

以GD32F103C8T6为例的核心板原理图PCB绘制学习笔记简单总结

重点在supplier part是立创商城的编号,可以搜到。

2301_80397661的博客 3263

基于人脸识别的驾驶员疲劳检测方法研究

摘 要交通安全问题愈发严重,疲劳驾驶已是造成交通事故的主要因素之一。为减少因疲劳驾驶造成的交通事故,本文设计了一种基于图像处理技术的疲劳驾驶监测系统,该系统结合了肤色模型、灰度积分投影技术以及PERCLOS方法,旨在通过实时视频图像分析准确检测驾驶员的疲劳状态。首先,系统通过肤色模型从图像中有效提取人脸区域,并在此基础上利用Haar级联分类器进行人脸检测,确保在人脸角度变化或部分遮挡的情况下依然能够实现高效识别。接着,灰度积分投影技术被应用于眼部定位,通过分析眼睛区域的灰度变化,精确确定眼睛的上下边界,从

carrott0617的博客 1005

POJ 3565 Ants(二分图最小权匹配,KM算法)

题目链接:http://poj.org/problem?id=3565DescriptionYoung naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees. Each ant colony needs its own apple tree to feed its...

baodream的博客 352

中兴U30air随身WiFi刷机全攻略:从ABD开启到系统调试(附工具包)

本文提供中兴U30air随身WiFi刷机全攻略,从ADB开启到系统调试的详细步骤,包括必备工具清单、ADB调试模式解锁、Bootloader解锁及自定义ROM刷入与调优。适合技术爱好者深度定制设备,提升网络性能和功能扩展。

weixin_29235923的博客 1958

POJ - 3565 Ants(二分图最小权匹配+KM+思维)

题目链接:点击查看 题目大意:给出n个蚂蚁和n个苹果树的坐标,我们需要求出每个蚂蚁平时觅食所要去的苹果树,必须保证所有路径不能有交叉 题目分析:因为所有的边不能有交叉,所以我们选择距离最短的两个点匹配即可,然后n个蚂蚁匹配n个苹果树,又是一个完备匹配问题,那么这个题目就转换成了一个最小权匹配的问题了,直接套模板就行了吗?不,其实还有个很严谨的证明,一开始我是为了省精度,用了距离的平方建边,一直...

Falcon的博客 574

桌面云虚拟机Ubuntu离线安装open-vm-tools

公司办公在桌面云中进行开发,桌面云是无法访问外网的,然后又有安装虚拟机的需求,使用VMware自带的VMware-tools安装功能失败,报错也需要联网才能解决,如果不安装VMware-tools,则虚拟机无法使用共享文件夹功能以及与本机共享剪贴板功能,非常难受,故自己研究解决如何离线安装open-vm-tools(open-vm-tools 是 VMware Tools 的开源实施)打开Ubuntu,可以在文件中看到生成的ISO文件,点开,将四个软件包复制粘贴至桌面。

weixin_43397593的博客 5077

期权定价模型系列[11]三叉树期权定价[trinomial model ]

三叉树期权定价方法简介

xiaowu1997的博客 1847

【POJ】3565Ants(二分图最优匹配)

Description Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees. Each ant colony needs its own apple tree to feed itself. Bill has a map with coordin...

红点雷龙XL 389

matlab液体湿润模拟,【水文模型】01 三水源新安江模型

目录一、概述1.1 流域概况1.2 产流方式论证1.3 设计基本任务1.4 设计原始资料二、新安江模型2.1 流域划分2.2 产汇流计算2.2.1 蒸散发计算2.2.2 产流计算2.2.3 水源划分2.2.4 汇流计算2.3 模型参数2.3.1 参数物理意义2.3.2 参数率定结果2.4 模拟结果2.4.1 精度统计表2.4.2 计算与实测流量过程线比较三、精度统计与误差分析3.1 精度统计3.2...

weixin_34173656的博客 5327

POJ 3565 Ants 最小权匹配

题目链接:http://poj.org/problem?id=3565 Description Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees. Each ant colony needs its own apple tree to feed ...

橘嘉禾 69

9篇2章2节:GBD 数据库的数据申请详解

无论您是初入公共卫生领域的学生、资深的科研工作者,还是政策决策者,GBD数据库都将成为您数据分析与决策支持中不可或缺的重要工具。

MD Code 2601

BoT-SORT实战:手把手教你实现BoT-SORT训练和测试

文章目录摘要1、数据准备2、配置BoT-SORT环境2.1、获取代码2.2、创建虚拟环境2.3、安装必要的包2.3.1、安装pytorch2.3.2、安装cython2.3.3、安装Cython-bbox2.3.4、安装faiss2.3.5、安装其他的包3、训练3.1、生成REID数据集3.2、预训练模型3.2.1、ByteTrack预训练模型3.2.2、REID预训练模型3.3、开始训练4、如何更改FASTREID的BackBone?5、测试5.1、测试视频5.2、测试摄像头5.3、多类别测试 摘要 Bo

m0_47867638的博客 2298

POJ3565 Ants【二分图最佳匹配】

题目链接: http://poj.org/problem?id=3565 题目大意: 在坐标系中有N只蚂蚁,N棵苹果树,给你蚂蚁和苹果树的坐标。让每只蚂蚁去一棵苹果树, 一棵苹果树对应一只蚂蚁。这样就有N条直线路线,问:怎样分配,才能使总路程和最小,且 N条线不相交。 思路: 用一个图来说明思路。 假设A、B为蚂蚁,C、D为苹果树。则存在两种匹配:第一种

程序员充电站(itcharge) 2455

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

poj 3565 Ants KM

题意: 给n只蚂蚁和n课苹果树的坐标,要让每只蚂蚁去一棵苹果树,路线不能重复,求一种可行方案。 分析: 当某种匹配可行时蚂蚁所走的距离和是最小的,可以直接用KM算法求二分图最小权值匹配。还有一种做法是先假定一种匹配,如果其中有交叉就进行调整。 代码: //poj 3565 //sep9 #include #include using namespace std; const in

sepNINE的专栏 1531

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

POJ 3565 Ants (带权二分图最大完备匹配)

题目链接 题目大意: 平面上共有2*N个点,N个是白点,N个是黑点。对于每个白点,找到一个黑点,把二者用线连起来,要求最后所有线段都不想交,求一种方案。 满足总路程之和最小的方案一定不相交 详见https://blog.youkuaiyun.com/lianai911/article/details/44835659 可以建立一个二部图,然后用KM跑最小权匹配,KM跑最小权其实就是把各个边上的权值...

correct 339

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

poj 3565 Ants KM算法

题目:http://poj.org/problem?id=3565 题意:给你n个蚁群和n个苹果树,用两个数表示其坐标,把每个蚁群对应一棵苹果树,且所有的蚁群和其对应的苹果树的连线不能相交。输出每个蚁群对应的苹果树 明显的二分图问题,把蚁群与苹果树之间的距离作为边,求完备匹配的最小权值和。最小权值和必定不会出现相交的边,比如AB, CD交于E, 那么明显AC + BD #include

弱智就要多努力 789

Ants - HDU 3565 - 二分图KM - 详解

链接:  http://poj.org/problem?id=3565题目:DescriptionYoung naturalist Bill studies ants in school. His ants feed on plant-louses that live on apple trees. Each ant colony needs its own apple tree to feed i

LucienShui 688

POJ-3565 二分图——km算法

题目链接:http://poj.org/problem?id=3565题目大意:在坐标系中有N只蚂蚁,N棵苹果树,给你蚂蚁和苹果树的坐标。让每只蚂蚁去一棵苹果树,一棵苹果树对应一只蚂蚁。这样就有N条直线路线,问:怎样分配,才能使总路程和最小,且N条线不相交。思路:用一个图来说明思路。假设A、B为蚂蚁,C、D为苹果树。则存在两种匹配:第一种是AD、BC,第二种是AC、BD。根据三角形不等式AD+BC...

usernamezzz的博客 231

poj 3565

题意:给定平面上的n个白点和n个黑点,要求用n条线段连接白点和黑点, 并且每一条线段不想交 分析:黑白点可看为二分图中的x集合和y集合,可得出当两个集合为最小圈匹配时一定满足条件 #include #include #include #include const int N = 100 + 5; const double eps = 1e-10; int n;

做一个善于思考的人 1045

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

由于涉及到实数,一定,一定不能直接等于,一定,一定加一个误差<0.00001,坑死了…… 有两种事物,不难想到用二分图。这里涉及到一个有趣的问题,这个二分图的完美匹配的最小权值和就是答案。为啥呢?因为如果有四个点,a,b,c,d。Ab和cd交叉,ac和bd不交叉,那么ac和bd的长度和一定小于ab和cd的长度和,可以画一个图很容易就证出来。所以,如果所有的边都不交叉,又因为有解,...

weixin_34405557的博客 159

二分图 KM算法应用

poj 2195 这个之前用最小费用流做过,思路还是很清晰的 这次用的是KM算法(求权值最大,不过求最小权值的话,把权值取负就行了) 算是模板题 下面是代码,也算是KM的模板,还是用的kuangbin的 #include #include #include #include #include using namespace std; //***********

is_it_a_error的博客 479
上一篇: POJ 2771 Guardian of Decency 二分图最大独立集
下一篇: UVA 10607 Siege
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值