匈牙利算法 && EK(邻接表)

四、匈牙利算法,dijkstra,拓扑排序(附例题) 匈牙利算法,dijkstra,拓扑排序(附例题) 阅读详情
/**
    用邻接表添边是图论中基础中的基础,实用价值十分可观
    添边为固定格式,理解的最好办法是画几个点,自己用手
    模拟一下添边的过程,你会感慨万千,成就感不言而喻。。

    链接表 3剑客为:edge[], edgeHead[], ne;

    edge[] 为每条边得结构体,你可以在里面放任何附加东西
    如:边权w, 流量c, 费用cost。 但v, next是最基本得两个
    变量,这决定了链接表的正常工作。。edge[u].v 即表示边 u-v
    edge[u].next 为u 连接的下条边在edge[]中的下标

    edgeHead[u] 表示节点u 在edge[] 中的位置,通过edgeHead[u]和
    edge[u].next 即可遍历连接u 的所有边,具体操作见下代码。

    特级注意:edgeHead[] 和 ne 的初始化
*/

/**
    匈牙利
*/

#include <cstring>

struct {
    int v, next;
}edge[EMax];

int edgeHead[NMax], link[NMax], vis[NMax];
int ne, n; //初始化为1  //n 为匹配点的个数
//初始化edgeHead[]数组为0
void addEdge(int u, int v) {
    edge[ne].v = v;
    edge[ne].next = edgeHead[u];
    edgeHead[u] = ne++;
}

bool dfs(int u) {
    for (int i=edgeHead[u]; i; i=edge[i].next) {
        int v = edge[i].v;
        if (!vis[v]) {
            vis[v] = true;
            if (link[v]==-1 || dfs(link[v])) {
                link[v] = u;
                return true;
            }
        }
    }
    return false;
}

int hungary() {
    int ans = 0;
    memset(link, -1, sizeof (link));
    for (int i=1; i<=n; i++) {
        memset(vis, 0, sizeof (vis));
        if (dfs(i))
            ans++;
    }
    return ans;
}

/**
    EK
*/

#include <algorithm>
#include <cstdio>
#include <csting>

const int inf = 0x3f3f3f3f;

struct {
    int u, v, c, next;
}edge[EMax];
int ne, edgeHead[NMax], pre[NMax];
int ans;

//ne 要初始化为2 因为下面找逆向边所需
//2^1 = 3  3^1 = 2
//即偶数的逆向边即为加1,奇数的逆向边减1
//没关系,即使不理解也没事,只要你相信,当你理解后你会豁然开朗你会觉得它是如此简单就好

void addEdge(int u, int v, int c) {
    edge[ne].u = u; edge[ne].v = v;
    edge[ne].c = c; edge[ne].next = edgeHead[u];
    edgeHead[u] = ne++;
    edge[ne].u = v; edge[ne].v = u;
    edge[ne].c = 0; edge[ne].next = edgeHead[v];
    edgeHead[v] = ne++;
}

bool bfs(int s, int t) {
    int que[NMax], vis[NMax], head=0, tail=1;
    memset(vis, 0, sizeof (vis));
    que[0] = s; vis[s] = true;

    while (tail > head) {
        int u = que[head++];
        for (int i=edgeHead[u]; i; i=edge[i].next) {
            int v = edge[i].v;
            if (!vis[v] && edge[i].c) {
                pre[v] = i;
                if (v == t)
                    return true;
                que[tail++] = v;
                vis[v] = true;
            }
        }
    }
    return false;
}

void end(int s, int t) {
    int i, u, sum=inf;
    for (u=t; u!=s; u=edge[i].u) {
        i = pre[u];
        sum = min(sum, edge[i].c);
    }
    for (u=t; u!=s; u=edge[u].u) {
        i = pre[u];
        edge[i].c -= sum;
        edge[i^1].c += sum;
    }
    ans += sum;
}

void EK(int s, int t) {
    while (bfs(s, t))
        end(s, t);
}

//初始化edgeHead = 0, ne = 2;

 

收藏于 2011-11-23
来自于百度空间

匹配算法·温故知新——二分图的最大(基数)匹配 反思说起二分图匹配大家都会自然而然地想到匈牙利算法,因为它太出名了。之所以有名,我想很大程度上是因为它简单,而简单更多的是指代码简单。然而站在巨人肩膀上的我们,真正遇到这个问题,如果没有接触过,能在短时间内推出这个算法么?我想未必。 更何况学会匈牙利算法,我们有是否考虑过如何推广到一般图,如何优化时间复杂度,与网络流等其他方法在本质上有什么相通之处呢?恐怕与Zvi Galil的差距就来源于此吧。 阅读详情

相关推荐

匈牙利算法-邻接表

匈牙利算法-邻接表实现 还有一些注释,应该很清楚

匈牙利算法加邻接表

因为匈牙利算法存储边为二维数组,本人怕其空间超限,所#include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;cstdlib&gt; using namespace std; int v[1000],u[1000],fir[1000],next[1000],f[1000],used[1000]; int n,m,bian; int ...

立志变成java巨头 509

目标检测数据集 第069期-基于yolo标注格式的玻璃清洁状态检测数据集(含免费分享)

但这类技术的落地,离不开大量标注规范、场景丰富的数据集作为算法训练的支撑,玻璃清洁状态检测数据集的出现,正是为了满足这一市场与技术需求。在高校与科研机构的计算机视觉研究中,该数据集可作为基础研究素材,用于探索物体状态识别的算法优化方向,比如针对玻璃这类透明物体的检测算法改进,或是小样本场景下的状态识别研究。通过摄像头采集车窗、挡风玻璃的图像,算法自动检测玻璃清洁度,若识别到脏污影响视线,及时提醒运维人员清洁,避免因玻璃脏污引发的安全事故,提升交通出行的安全性。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 128

模板 匈牙利算法(邻接表、dfs)

匈牙利算法(邻接表、dfs版本) #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; typedef long long ll; const int MAXN = 1e3 + 5; int V; //顶点数目 vecto...

Authur_gyc 315

VS code平台调试AutoLISP程序教程

VS code平台调试AutoLISP程序教程

BearElder的博客 3184

QGroundControl高级配置与自定义功能实战指南

本文深入探讨了QGroundControl(QGC)的高级配置与自定义功能,为无人机开发者、系统集成商和高级用户提供实战指南。内容涵盖从品牌界面定制、自定义MAVLink消息处理,到插件开发与自动化部署的全流程,旨在帮助用户解锁QGC的隐藏潜力,打造专属的行业解决方案。

weixin_29234509的博客 240

匈牙利算法(邻接表)

象棋 描述 你有足够多的象棋“车”,在一个n×n的棋盘上你能放多少个“车”呢?注意,所给棋盘上有些位置不能放任何东西。同时,某一行(列)最多只能存在一个“车”。 输入 第一行为一个正整数n。 接下来n行,每行包含n个整数,若为0表示这个位置不能放“车”;若为1表示这个位置可以放“车”。 输出 输出一个整数,表示最多能放多少个“车”。 样例1输入 5 1 0 0 0 0 0 0 ...

ACM_JURUO 671

手把手教你用Python实现ITRS与GCRS坐标转换(附完整代码)

本文详细介绍了如何使用Python的Astropy库实现ITRS与GCRS坐标转换。文章从环境配置、坐标对象构建入手,深入解析了transform_to方法背后的转换矩阵与地球定向参数管理,并通过卫星地面轨迹计算实战案例,帮助开发者掌握高精度空间坐标转换的核心技术与工程实践。

weixin_28335283的博客 81

二分图的最大匹配——最大流EK算法

序: 既然是个图,并且求边数的最大值。那么这就可以转化为网络流的求最大流问题。 只需要将源点与其中一子集的所有节点相连,汇点与另一子集的所有节点相连,将所有弧的流量限制置为1,那么最大流 == 最大匹配。(感谢yulemao大神的指点)只需要在初始化的时候修改一下,就可以直接用求最大流的算法模板了。 本文代码使用EK算法, 为POJ 1469的AC代码。 EK算法解析源代码:/* About

箜瑟_qi的博客 948

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 159

YOLOv8 智能交通流量监测完整解决方案

YOLOv8智能交通流量监测系统基于先进的目标检测技术,提供实时车辆识别与统计分析功能。该系统通过虚拟检测线实现多方向车流量统计,支持多种车辆类型分类,并具备数据可视化、异常事件预警等核心功能。完整解决方案包含模型训练、实时检测、批量处理、结果分析等模块,并提供Flask API和Docker两种部署方案。系统采用YOLOv8算法实现高效检测,支持GPU加速,可通过量化、剪枝等技术进一步优化性能,为智能交通管理提供可靠的数据支持和技术保障。

u010117029的博客 118

二分图匹配(匈牙利, 最大流)

匈牙利 #include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<cstdlib> #include<cmath> #include<stack> #include<map> #include<ve...

zufesatoshi的博客 301

软考高级-系统架构设计师 知识点整理 (一篇就够了 建议收藏)

软考高级-系统架构设计师知识点整理---十万字总结,助你通过高级

片言可决讼,半纸能缚龙 7351

匈牙利&&EK算法(写给自己看)

(写给自己看)匈牙利算法(最大匹配)和KM算法(最佳匹配) 匈牙利算法 思想 不断寻找增广路,每次寻得增广路,交换匹配边和非匹配边,则匹配点数+1 这里增广路含义:交错路,即从未匹配点出发经过未匹配边->匹配边->未匹配边->.....->未匹配边 Konig定理:无权二分图的最大匹配=最小覆盖点集,证明 有价值的博客:blog1,blog2,blog3 算法其实并不难 ...

weixin_33973609的博客 172

Python爬虫:抓取专利数据并分析专利趋势

本文展示了如何使用 Python 爬虫技术抓取中国专利数据,并对数据进行了清洗、分析和趋势预测。通过分析专利数据,企业和科研机构可以了解行业的技术发展趋势,进行技术创新战略规划。未来,我们可以进一步扩展爬虫的功能,抓取更多专利数据,增加多维度的数据分析,如技术领域、地域分布等。同时,可以尝试使用深度学习模型(如 LSTM)进行时间序列预测,以获得更准确的专利趋势预测。

2201_76125261的博客 1787

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

POJ 1422 Air Raid(二分图匹配+最小路径覆盖+匈牙利算法)

Consider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an intersection and walking through town's streets you can never reach the same intersection i.e. the town's stree

HJY 400

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【匈牙利算法】最大二分匹配——算法设计与分析

介绍了最大二分匹配问题,介绍了Hungarian匈牙利算法,并给出算法实例展示。

友人帐_的博客 822

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

二分图最大匹配——匈牙利算法,网络流初步——最大流问题+最小费用最大流+常用建图

二分图最大匹配——匈牙利算法 对不起 懒得粘 图太多 但是真的好秀 人家创作的确实好,真丶看一遍就懂了 作者:Dark_Scope 来源:优快云 原文:https://blog.youkuaiyun.com/dark_scope/article/details/8880547 写这个博客 主要还不是不喜欢书上的板子,自己理解后按照自己的理解写出最适合自己的板子多好 留个匈牙利算法的...

permi_yaxileni的博客 2706

poj 1274 The Perfect Stall(匈牙利算法)

<br /> <br /> 这个之前用最大流做过了,用最大流模拟最大匹配。。。建立源汇然后。。<br /> <br />详见 http://blog.youkuaiyun.com/zxy_snow/archive/2011/02/06/6173428.aspx<br /> <br />这个是学了匈牙利算法后第一个想起来的题,就来写了下,刚才A掉了,16ms,查了下以前用EK最大流算法A的,300+MS。。时间差好多哎。。<br /> <br />说了,贴代码,水题一道,匈牙利的英文名字  Hungary。<br /> 

小媛在努力~ 1369

最大流问题(EK算法模板)

最近在看 最大流问题,因为是第一次涉及到这种问题,以及第一次接触到这种类型的算法,所以刚开始一头雾水。 首先,这种问题概念比较多,残存网络,增广路径,最小割,流量对称,等。 其次,虽然有现成的方法解决,但是解决此方法的算法有多种,优化的算法也有很多。 刚开始看 Dinic 匈牙利算法,真心没看懂。。  现在我写了一份模板,是EK算法实现的。应该算最简单的一种实现方法了。我觉得,只要会熟练掌握

Jaster_wisdom的专栏 1559

POJ 2239 Selecting Courses(二分图匹配——匈牙利算法||网络流)解题报告

题目大意: 在大学里有许许多多的课程,现在李明需要去选择课程,他是一个爱学习的人,所以想尽可能多的选择课程。 在学校里有n个课程,每周7天,每天有12节课,一周一共有有7*12节课。某一节课在一周内会上x次,一周内的这x次内容一样,只需要去一次就可以了。同时,某个时间李明最多只能去上一门课程。问李明最多能上多少门课。 输入第一行为n,代表有n个课程。接下来n行,每行第一个数字x代表这个课程在

Light_Time 1005

poj 1422 Air Raid 匈牙利算法

题目: Consider a town where all the streets are one-way and each street leads from one intersection to another. It is also known that starting from an intersection and walking through town's streets yo...

zamaochick的博客 173

PKU 2584 - T-Shirt Gumbo (二分图最大匹配 & 匈牙利算法 | 最大流 & EK)

题意 给出一个人能穿的型号和每个型号衣服的多少,求能不能每个人恰好分配到一件。 思路 第一次先用最大流写了一下,然后就试试最大匹配。 最大匹配就是把n件相同的衣服拆成一件一件,分别编号,再把人和它们相连,然后就匈牙利算法了。  感觉用最大匹配写繁琐一点。 被注释部分是最大流的 代码 #include #include #include

一只冰熊 943

HDU 1151 Air Raid 最小路径覆盖,二分图匹配匈牙利算法(邻接表存关系)处理有向图

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1151 Air Raid Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5276    Accepted Submission(s

雪的期许 836

最佳二分图匹配算法(总结)

EK算法     O(n*e^2) 通过调整加权完全二分图的可行顶标,将加权完全二分图转化为无权二分图,使得加权完全二分图的最佳匹配与转化后的无权二分图的最佳匹配相同,在此基础上采用匈牙利算法。 最小费用最大流算法    O(n*e) 将带权二分图转化为相应的网络流图, 1)构建源点s跟汇点t 2)对于iX,建立一条容量为1,费用为0的有向边(s,i). 3)对于jY,建立一条容量为1...

兜率工的博客 1619
上一篇: 匈牙利算法(二分图匹配)
下一篇: 二分图匹配的扩展问题
zcube
博客等级 码龄17年 170粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值