图论---匈牙利算法求二分图最大匹配的实现

开始编程前分析设计思路和程序的整体的框架,以及作为数学问题的性质:

程序流程图:

数学原理:

        求解二分图最大匹配问题的算法,寻找一个边的子集,使得每个左部点都与右部点相连,并且没有两条边共享相同的端点。使用深度优先搜索来寻找增广路径。当找到一条增广路径时,将路径上的边加入匹配集合中,并更新匹配状态。重复这个过程直到无法找到增广路径为止。

时间复杂度分析:

        时间消耗来自于DFS搜索和增广路径的寻找。对于每个左侧未匹配的点u,需要进行一次DFS搜索。在最坏情况下,DFS搜索需要遍历所有的右侧点,因此时间复杂度为O(n)。由于需要进行n次DFS搜索,所以时间复杂度为O(n^2)。

源代码:

#include <iostream>
#include <vector>
#include <cstring>
using namespace std;const int MAXN = 505; // 最大顶点数
int n, m, k; // n为左部点数,m为右部点数,k为总变数
vector<int> G[MAXN]; // 邻接表表示二分图
int match[MAXN]; // match[i]表示右边第i个点匹配的是左边的哪点,如果没有匹配则为-1
bool vis[MAXN]; // DFS中标记右边各点是否已经被访问过
//进行深度搜索最大匹配边
bool dfs(int u) {int i;for (i = 0; i < G[u].size(); i++) {int v = G[u][i];if (!vis[v]) {vis[v] = true;if (match[v] == -1 || dfs(match[v])) {match[v] = u;//对边进行存储return true;}}}return false;
}
//匈牙利算法
int hungarian() {int res = 0;memset(match, -1, sizeof(match));for (int i = 1; i <= n; i++) {memset(vis, false, sizeof(vis));if (dfs(i)) res++;}return res;
}
int main() {cin >> n >> m >> k; // 输入左部点数和右部点数int u, v;int i=0;for(;i<k;i++){cin >> u >> v ; // 输入边 (u, v),u属于左部,v属于右部G[u].push_back(v);}int max_matches = hungarian(); // 计算最大匹配数cout << "最大匹配边数:" << max_matches << endl;// 输出最大匹配数// 输出最大匹配的所有边cout << "最大匹配边为:" << endl;for (int v = 1; v <= m; v++) {if (match[v] != -1) { // 如果右部点v有匹配cout << "Edge: " << match[v] << " - " << v <<endl; // 输出匹配边}}system("pause");return 0;
}

测试用例:(两侧顶点数均大于10,且两侧顶点数不相等)

输出结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/376108.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何通过文件分发系统,实现能源电力企业文件的安全分发流转?

随着企业业务的快速发展&#xff0c;能源电力企业会在全国乃至全球&#xff0c;设立总部-分部-办事处/网点等多层级的结构&#xff0c;因此会涉及自动化的文件分发的业务场景。文件分发系统是一种将文件从一个地方自动传输到多个接收者的过程&#xff0c;可以提高工作效率&…

Linux 复现Docker NAT网络

Linux 复现Docker NAT网络 docker 网络的构成分为宿主机docker0网桥和为容器创建的veth 对构成。这个默认网络命名空间就是我们登陆后日常使用的命名空间 使用ifconfig命令查看到的就是默认网络命名空间&#xff0c;docker0就是网桥&#xff0c;容器会把docker0当成路由&…

Prometheus+Grafana主机运行数据

目录 介绍 安装Node Exporter 配置Prometheus 验证配置 导入仪表盘 介绍 Prometheus是一款开源的监控和警报工具&#xff0c;而Node Exporter是Prometheus的一个官方插件&#xff0c;用于采集主机上的各种系统和硬件指标。 安装Node Exporter 下载最新版本的Node Export…

STM32入门开发操作记录(一)——新建工程

目录 一、课程准备1. 课程资料2. 配件清单3. 根目录 二、环境搭建三、新建工程1. 载入器件支持包2. 添加模块3. ST配置4. 外观设置5. 主函数文件 一、课程准备 1. 课程资料 本记录操作流程参考自b站视频BV1th411z7snSTM32入门教程-2023版 细致讲解 中文字幕&#xff0c;课程资…

matine组件库踩坑日记 --- react

Mantine实践 一 禁忌核心css样式二 添加轮播图扩展组件 一 禁忌核心css样式 import React from react import ReactDOM from react-dom/client import { BrowserRouter } from react-router-dom; import App from ./App.jsx import ./index.css import mantine/core/styles.cs…

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用

经典关系抽取(一)CasRel(层叠式指针标注)在DuIE2.0数据集上的应用 关系抽取&#xff08;Relation Extraction&#xff09;就是从一段文本中抽取出&#xff08;主体&#xff0c;关系&#xff0c;客体&#xff09;这样的三元组&#xff0c;用英文表示是 (subject, relation, obj…

python作业三

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用io流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import json import shutilimport requests #使用requests模块获…

CDN在App分发中的作用

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;在App分发中扮演着至关重要的角色。它通过一系列技术手段&#xff0c;将App的内容高效、快速地传递给用户&#xff0c;显著提升用户体验和下载速度。以下是CDN在App分发中的具体作用和优势&#x…

[RuoYi-Vue] - 1. 项目搭建

文章目录 &#x1f42c;初始化后端项目拉取RuoYi-Vue代码Maven构建导入数据库ry-vue修改配置信息启动Redis启动项目 &#x1f30c;初始化前端项目拉取RuoYi-Vue3代码项目运行成功页面 &#x1f42c;初始化后端项目 拉取RuoYi-Vue代码 若依/RuoYi-Vue 代码地址 Maven构建 导入数…

react启用mobx @decorators装饰器语法

react如果没有经过配置&#xff0c;直接使用decorators装饰器语法会报错&#xff1a; Support for the experimental syntax ‘decorators’ isn’t currently enabled 因为react默认是不支持装饰器语法&#xff0c;需要做一些配置来启用装饰器语法。 step1: 在 tsconfig.js…

nginx基本概念和安装

一. 简介 1.1 是什么 nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;是一款轻量级的Web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器&#xff0c;在BSD-like协议下发行&#xff0c;特点是占有内存少&#xff0c;并发能力强。ngnix专为性能优化而开发&#…

如何利用桌面工作计划软件制定自己的to do清单?

在我们的日常生活和工作中&#xff0c;经常会遇到各种各样的任务需要完成。如果没有一个明确的计划和安排&#xff0c;我们可能会感到混乱和压力&#xff0c;而桌面工作计划软件可以帮助我们更好地管理和规划我们的时间和任务。今天&#xff0c;我们就来聊聊如何利用这些工具&a…

Linux 一键部署Mysql 8.4.1 LTS

mysql 前言 MySQL 是一个基于 SQL(Structured Query Language)的数据库系统,SQL 是一种用于访问和管理数据库的标准语言。MySQL 以其高性能、稳定性和易用性而闻名,它被广泛应用于各种场景,包括: Web 应用程序:许多动态网站和内容管理系统(如 WordPress)使用 MySQL 存…

红日靶场----(三)1.漏洞利用

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

LDR6282-显示器:从技术革新到视觉盛宴

显示器&#xff0c;作为我们日常工作和娱乐生活中不可或缺的一部分&#xff0c;承载着将虚拟世界呈现为现实图像的重要使命。它不仅是我们与电子设备交互的桥梁&#xff0c;更是我们感知信息、享受视觉盛宴的重要窗口。显示器在各个领域的应用也越来越广泛。在办公领域&#xf…

【前端速通系列|第二篇】Vue3前置知识

文章目录 1.前言2.包管理工具npm2.1下载node.js2.2配置 npm 镜像源2.3 npm 常用命令 3.Vite构建工具4.Vue3组件化5.Vue3运行原理 1.前言 本系列文章旨在帮助大家快速上手前端开发。 2.包管理工具npm npm 是 node.js中进行 包管理 的工具. 类似于Java中的Maven。 2.1下载nod…

创建React 项目的几种方式

①.react自带脚手架 使用步骤&#xff1a;&#xff08;自动&#xff09; 1、下载 npm i create-react-app -g 2、创建项目命令&#xff1a; create-react-app 项目名称 ②.Vite构建工具创建react步骤&#xff1a;&#xff08;推荐&#xff09; 方法一&#xff1a; 1、yarn cr…

【笔记】dbeaver导出数据库结构+数据 再导入其他数据库

导出&#xff1a; 导入 然后将语句粘贴进去 会有报错 选全部跳过 然后就全部添加成功了 虽然我不知道为什么报错 但是能加进去数据结构和数据都在就无所谓了 第二个版本 DBeaver导出sql脚本&#xff0c;执行sql脚本-CSDN博客 通过工具 DBeaver操作 MySQL导入备份的 sql 报错…

kali安装vulhub遇到的问题及解决方法(docker及docker镜像源更换)

kali安装vulhub&#xff1a; 提示&#xff1a;项目地址 https://github.com/vulhub/vulhub 项目安装&#xff1a; git clone https://github.com/vulhub/vulhub.git 安装docker 提示&#xff1a;普通用户请使用sudo&#xff1a; 首先安装 https 协议、CA 证书 apt-get in…

【机器学习】使用决策树分类器预测汽车安全性的研究与分析

文章目录 一、决策树算法简介决策树的结构分类和回归树 (CART)决策树算法术语决策树算法直觉 二、属性选择度量信息增益熵 基尼指数计算分割基尼指数的步骤 三、决策树算法中的过度拟合避免过度拟合的方法 四、导入库和数据可视化探索性数据分析重命名列名查看数据集的总结信息…