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的专栏 3420

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

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

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万+

DMA 定制固件教程:小白跟做即得单人固件,超详细纯喂饭教程,100% 成功秘籍!FPGA仿真1:1、中断逻辑和TLP核心都在。

DMA 定制固件教程 小白跟着操作做可以做出的单人固件。DMA仿真技术io、中断逻辑,从零仿真。图文链接教程:https://docs.qq.com/doc/DQ01lVGtHelROVHNv

qq_15741349的博客 3万+

Ubuntu服务器通过IPV6端口转发搭建幻兽帕鲁私服实战

本文详细介绍了在Ubuntu服务器上通过IPV6端口转发搭建幻兽帕鲁私服的完整教程。针对只有公网IPV6地址的服务器环境,提供了从硬件检查、端口转发工具配置到游戏服务器安装的全流程解决方案,帮助玩家轻松实现多人联机游戏体验。

weixin_30652491的博客 490

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

Canoe Panel基础功能介绍

CANoe Panel 是 Vector CANoe 软件中用于设计图形化操作界面的功能模块。用户可以在面板上添加合适的控件,实时的改变信号或者变量的值

m0_56208280的博客 1951

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

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

Falcon的博客 574

【用unity实现100个游戏之2】复刻实现经典2d平台跳跃游戏《蔚蓝 Celeste》(附工程源码)

蔚蓝》是一款备受好评的独立游戏,由游戏开发工作室开发并由发行。这款游戏于2016年首次发布,并在玩家和评论界收获了广泛赞誉。蔚蓝以其独特的艺术风格和引人入胜的故事而著称。游戏以深海为背景,玩家将扮演一个能够探索水下世界的神秘生物。游戏通过惊人的视觉表现和动态的海洋生态系统为玩家带来了令人难忘的游戏体验。无论是广阔的水下景观还是充满生机的海洋生物,蔚蓝都让玩家感受到深海的神秘和美丽。蔚蓝在玩法上注重探索和解谜。玩家可以在海底环境中自由游动,发现隐藏的地点和秘密,与各种生物互动,并解决环境谜题以继续前进。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4169

机器学习(十九):梯度提升回归(GBR)

机器学习中的梯度提升回归算法原理与案例实战。

全栈川川 5157

【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

如何合理评估信号过孔的残桩效应--Via Stub

设计中,之所以会去考察信号过孔的残桩效应(Via Stub),是因为它的存在导致了不需要的频率谐振,当这些谐振出现在所关注的信号通道的插入损耗中时,就会引发较为严重的信号完整性(SI)问题,那么Via Stub到底是如何引发SI问题的呢?

一只豌豆象的博客 4466

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

C#里使用NModbus来创建一个TCP从站服务

摘要:本文介绍了一个用C#实现的Modbus TCP从站服务器,基于.NET Framework 4.6.1开发。代码使用NModbus库创建TcpListener和ModbusSlaveNetwork,支持设置IP地址、端口号和从站ID。服务器实现了数据存储初始化功能(包括线圈和保持寄存器),并提供了启动/停止操作的UI界面和日志记录功能。该解决方案适用于需要调试Modbus TCP协议的场景,特别适合无法升级到更高版本.NET Framework的环境。

大坡3D软件开发 478

vue2 - elementUI表格table树形结构复选框勾选父子联动示例,el-table树状表格tree复选框checkbox多选框全选/反选取消children(当子级全选中,父级自动勾选)

vue2,elementui,el-table树状表格多选,树形结构结合多选框使用,实现单选父子联动全选反选,勾选联动父级勾选,表格多选check父子联动,table表格children如何嵌入复选框,el-table使用多选框与树形数据写一个有半选全选功能的表格,el-table树形表格实现复选框多选效果,表格树状结构多选,每一个row都可以选中并且联动全选按钮,table选父带子选子带父,树形数据与懒加载,Table表格树形结构多选框选中父级时会选中子级,elementUI表格里树形结构嵌套复选框全选全

✅ 精选推荐文章 1万+

POJ3565 Ants【二分图最佳匹配】

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

程序员充电站(itcharge) 2455

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

poj 3565 Ants KM

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

sepNINE的专栏 1531

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

correct 339

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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、付费专栏及课程。

余额充值