算法學習筆記(匈牙利算法)

匈牙利算法可以求解二分圖的最大匹配問題(二分圖:如果無向圖 G = ( V , E ) G = (V, E) G=(V,E)的所有點可以分為兩個集合 V 1 、 V 2 V_1、V_2 V1?V2?,所有的邊都在 V 1 V_1 V1? V 2 V_2 V2?之間,而 V 1 V_1 V1? V 2 V_2 V2?的內部沒有邊,稱 G G G是一個二分圖。)。

直接引用例題進行解釋。

例題:情人節

題目描述

溫馨提示:2月14日是第一臺通用計算機在賓夕法尼亞大學誕生的日子,在這個特殊的日子,請多花點時間陪陪你的電腦。

現在有 n n n個男孩( 1 ~ n 1~n 1n編號), m m m個女孩( 1 ~ m 1~m 1m編號),如果一對男女之間存在曖昧關系,那么他倆就有可能成為情侶,現在給出 k k k對曖昧關系,請問最多可以產生多少對情侶?

輸入描述

第一行三個整數 n , m , k n,m,k n,m,k ( 1 ≤ n , m ≤ 3 × 1 0 3 , 1 ≤ k ≤ 1 0 4 ) (1 \leq n,m \leq 3 \times 10^3,1 \leq k \leq 10^4) (1n,m3×103,1k104)

接下來 k k k行,每行表示一個曖昧關系 x , y x,y x,y,表示男孩 x x x和女孩 y y y存在曖昧關系。 ( 1 ≤ x ≤ n , 1 ≤ y ≤ m ) (1 \leq x \leq n,1 \leq y \leq m) (1xn,1ym)

輸出描述

一行輸出結果。

輸入樣例

3 4 5
1 1
1 2
1 3
2 1
3 4

輸出樣例

3

解釋

至多可以產生三對情侶,分別是 [ 1 , 3 ] , [ 2 , 1 ] , [ 3 , 4 ] [1,3],[2,1],[3,4] [1,3],[2,1],[3,4]

匈牙利算法的流程是這樣的:

對訪問到的男孩,如果他的曖昧對象沒有被分配情侶,那么直接將他們兩配對。如果當前訪問到的曖昧對象被分配了對象,那么他會試圖拆開他們,而被訪問的曖昧對象的情侶則會找他其他的曖昧對象試圖進行配對,往復下去,如果能結對,那么皆大歡喜。如果不行,則返回到第一層那里,去看他的下一個曖昧對象是否已經和他人配對。

原理是一個貪心的思想:當一個節點匹配后,不改變他已經匹配的狀態,只可能更換他的匹配對象,從而實現全局的最大匹配。

采用 d f s dfs dfs來實現。

#include<bits/stdc++.h>
using namespace std;
const int N = 3e3 + 9;vector<int> g[N];
//記錄時間戳,防止一次訪問時走重復路徑,
//代替vis的功能,如果使用vis數組則需要多次清空vis數組
int dfn;        
int p[N];
int vis[N];bool dfs(int x)
{for(auto &y : g[x]){//當前男孩已經被訪問過了if(vis[y] == dfn) continue;     vis[y] = dfn;//如果女孩未經匹配或者下一個男孩可以更改匹配對象if(!p[y] || dfs(p[y]))      {p[y] = x;       //進行匹配return true;}}return false;
}void solve()
{int n, m, k; cin >> n >> m >> k;for(int i = 1; i <= k; ++i)     //存圖{int x, y; cin >> x >> y;g[x].push_back(y);}int ans = 0;        //存答案for(int i = 1; i <= n; ++i){dfn++;if(dfs(i)) ans++;}cout << ans << '\n';
}int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _ = 1;while(_--) solve();return 0;
}

PS: K o ¨ n i g K?nig Ko¨nig定理:最小點覆蓋數等于最大匹配數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11503.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11503.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解Python的類,實例和type函數

問題起源&#xff1a; class t():pass s1 t() s2 type("Student2",(),{}) isinstance(s1, type), isinstance(s2, type)為什么第一個是false&#xff0c;第二個是true呢 根因定位&#xff1a; 在Python中&#xff0c;一切皆對象&#xff0c;類是對象&#xff0c…

nacos在沒有指定數據源的情況下默認使用什么數據庫?

在沒有特別指定數據源的情況下&#xff0c;Nacos 默認使用內嵌的數據庫 Derby 來存儲其數據。Derby 是一個輕量級的、基于 Java 的數據庫管理系統&#xff0c;適合于開發和測試環境&#xff0c;因為它簡單易部署且無需額外的數據庫服務器。然而&#xff0c;對于生產環境&#x…

使用ORM快速獲取業務對象列表

通常在實際開發中&#xff0c;業務對象的信息是需要來自多個數據表的。 我們如果想要獲取這個業務對象&#xff0c;就要先查詢數據表&#xff0c;再把查詢到的數據依次循環&#xff0c;組合轉換封裝成業務要使用的對象類型列表。 如果使用了ORM&#xff0c;那么這個過程就可以簡…

Stability AI 推出 Stable Artisan,終于可以在Discord上使用Stable Diffusion了!

Stable Diffusion 社區最常見的要求之一是能夠直接在 Discord 上使用他們的模型。近期&#xff0c;Stability AI 推出 Stable Artisan&#xff0c;這個需求終于被實現了。 Stable Artisan 支持在 Discord 上生成媒體&#xff0c;由 Stability AI 的尖端圖像和視頻模型 Stable D…

基于Springboot的實習生管理系統(有報告)。Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的實習生管理系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系結構&a…

mysql group by使用方法實例講解

MySQL中GROUP BY語句用于對某個或某些字段查詢分組&#xff0c;并返回重復記錄的第一條&#xff0c;本文章通過實例向大家介紹mysql group by使用方法和需要注意的地方&#xff0c;感興趣的朋友可以參考一下。 現在有這樣一個數據表book idfirst_namelast_namecityage1JasonM…

知乎知+廣告推廣該如何做?怎么收費?

知乎作為一個匯聚高質量用戶群體的知識分享平臺&#xff0c;成為了眾多品牌和產品推廣的優選之地。特別是知乎的“知”廣告推廣服務&#xff0c;以其精準定向、內容原生的特點&#xff0c;深受廣告主青睞。 一、知乎知廣告推廣基礎 1. 什么是知乎知&#xff1f; 知是知乎官方…

C++初階學習第七彈——探索STL奧秘(二)——string的模擬實現

標準庫中的string&#xff1a;C初階學習第六彈——string&#xff08;1&#xff09;——標準庫中的string類-CSDN博客 前言&#xff1a; 在前面我們已經學習了如何使用標準庫中的string類&#xff0c;但作為一個合格的程序員&#xff0c;我們不僅要會用&#xff0c;還要知道如…

C++類和對象下——實現日期類

前言 在學習了類和對象的六大成員函數后&#xff0c;為了鞏固我們學習的知識可以手寫一個日期類來幫助我們理解類和對象&#xff0c;加深對于其的了解。 默認函數 構造函數 既然是寫類和對象&#xff0c;我們首先就要定義一個類&#xff0c;然后根據實際需要來加入類的數據與函…

AI編程工具為什么選github copilot?

Github Copilot 是一個奇跡 它的競爭對手&#xff08;Amazon, Google, Meta, 騰訊&#xff09;都是免費的&#xff0c;但每月10-20美元的Github Copilot市場占有率最高。 1、2021年6月上線&#xff0c;比ChatGPT早近一年半 2、GitHub統計&#xff1a; 88%的用戶獲得效率提升平…

element ui的確認提示框文字樣式修改

修改確認提示框文字樣式修改&#xff0c;使用message屬性修改&#xff1a; 例&#xff1a; js代碼&#xff1a; this.$msgbox({title: 確定要刪除嗎?,message: this.$createElement(p, null, [this.$createElement(span, { style: color: red }, 該素材一旦刪除&#xff0c;…

Spring Boot日志

目錄 一、日志概述 1、為什么要學習日志&#xff1f; 2、日志的用途 &#xff08;1&#xff09;系統監控 &#xff08;2&#xff09;數據采集 &#xff08;3&#xff09;日志審計 二、日志使用 1、打印日志 &#xff08;1&#xff09;在程序中得到日志對象 &#xf…

QNX SLM介紹

QNX SLM SLM是Qnx中用來加載Application的組件&#xff0c;它可以監控Application行為&#xff08;比如異常退出時重新Application拉起&#xff09;、控制Application間的啟動時序。 QNX的SLM與Android RC文件類似。 下面摘自QNX官網介紹 System launch and monitor: launch c…

Redis日常維護流程及技巧:確保穩定性與性能

目錄 一、監控和報警設置 1.實時監控&#xff1a;洞察Redis的脈搏 &#xff08;1&#xff09;. 資源使用監控 &#xff08;2&#xff09;. 數據訪問模式監控 &#xff08;3&#xff09;. 持久化監控 &#xff08;4&#xff09;. 客戶端連接 2.報警機制&#xff1a;快速響…

標準Modbus TCP雙網口開關量模塊

M140E以太網遠程I/O無線數據采集模塊是一款工業級、隔離設計、高可靠性、高穩定性和高精度數據采集模塊&#xff0c;嵌入式32位高性能微處理器MCU&#xff0c;集成2路工業10/100M自適應以太網模塊里面。提供多種I/O&#xff0c;支持標準Modbus TCP&#xff0c;可集成到SCADA、O…

Spring STOMP-連接到消息代理

STOMP 代理中繼維護一個與消息代理的“系統”TCP 連接。這個連接僅用于來自服務器端應用程序的消息&#xff0c;不用于接收消息。您可以為此連接配置STOMP憑據&#xff08;即STOMP幀的login和passcode頭部&#xff09;。這在XML命名空間和Java配置中都以systemLogin和systemPas…

CentOs搭建Kubernetes集群

kubeadm minikube 還是太“迷你”了&#xff0c;方便的同時也隱藏了很多細節&#xff0c;離真正生產環境里的計算集群有一些差距&#xff0c;畢竟許多需求、任務只有在多節點的大集群里才能夠遇到&#xff0c;相比起來&#xff0c;minikube 真的只能算是一個“玩具”。 Kuber…

spring基礎使用(案例)

基于xml使用&#xff1a; 準備&#xff1a; 1.Dao層&#xff08;接口&#xff09;&#xff1a; public interface UserDao {public void save(); } 1.1 Dao層&#xff08;實現類&#xff09;&#xff1a; public class UserDaoIim implements UserDao {Overridepublic vo…

Day53代碼隨想錄動態規劃part13:300.最長遞增子序列、674. 最長連續遞增序列、718. 最長重復子數組

Day52 動態規劃part13 300.最長遞增子序列 leetcode鏈接&#xff1a;300. 最長遞增子序列 - 力扣&#xff08;LeetCode&#xff09; 題意&#xff1a;給你一個整數數組 nums &#xff0c;找到其中最長嚴格遞增子序列的長度。子序列是由數組派生而來的序列&#xff0c;刪除&a…