1. 程式人生 > >深度優先搜尋版的匈牙利演算法

深度優先搜尋版的匈牙利演算法

/****************************************************
    > File Name: hungry.cpp
    > Author: Yuji CAO
    > Mail: [email protected] 
    > Created Time: 日  6/11 18:29:58 2017
 *****************************************************/

#include<map>
#include<vector>
#include<unordered_set>
#include<unordered_map> #include<list> #include<queue> #include<deque> #include<stack> #include<iostream> #include<set> using namespace std; bool rematch_for_node(vector<vector<int> >& link_left_2_right, int left, vector<int>& match, unordered_set
<int>
& visited) { for (int j : link_left_2_right[left]) { if (visited.count(j) != 0) continue; if (match[j] != -1) { visited.insert(j); bool rematch = rematch_for_node(link_left_2_right, match[j], match, visited); if (rematch) { match[j] = left; return
true; } } else { match[j] = left; return true; } } return false; } int max_match(vector<vector<int> >& link_left_2_right, int m, vector<int>& match) { int res = 0; match.resize(m, -1); for (int i = 0; i < link_left_2_right.size(); ++i) { unordered_set<int> visited; bool tmp = rematch_for_node(link_left_2_right, i, match, visited); if (tmp) res++; } return res; } int main() { int n,m; cin>>n>>m; int n_edge = 0; cin>>n_edge; vector<vector<int> > link_left_2_right(n, vector<int>()); for (int i = 1; i <= n_edge; ++i) { int l, r; cin>>l>>r; link_left_2_right[l].push_back(r); } vector<int> match; int ans = max_match(link_left_2_right, m, match); cout<<"answer:\t"<<ans<<endl; for (int i = 0; i < match.size(); ++i) { cout<<i<<"\t"<<match[i]<<endl; } return 0; }

相關推薦

深度優先搜尋匈牙利演算法

/**************************************************** > File Name: hungry.cpp > Author:

day21 Python 實現的深度優先搜尋實現迷宮演算法

  # Python 實現的深度優先搜尋實現迷宮演算法 lookup_path = [] history_path = [] # maze = [[0, 0, 1, 0, 1], [1, 0, 0, 0, 1], [0, 0, 1, 1, 0], [0, 1, 0, 0, 0], [0

day21 Go 實現的深度優先搜尋實現迷宮演算法

  # Go 實現的深度優先搜尋實現迷宮演算法 package main import ( "errors" "fmt" "os" ) // 讀取檔案中的資料,使用迴圈生成迷宮圖 func readMazeFile(filename string) [][]int

演算法導論第三 22.3 深度優先搜尋 課後題答案全解析

22.3 深度優先搜尋:1. 問有向圖和無向圖可能存在的三種顏色的點到點之間的邊。這個問題比較簡單,直接上傳原版答案,但是要注意,有向圖中存在黑色點到其他點的邊,雖然黑色點是已經搜尋結束的,但是這樣的邊始終存在。有向圖: 無向圖: 2. 答案如下: 注意其中數字沒有重複的,無

九章演算法筆記 5.深度優先搜尋 Depth First Search

DFS cs3k.com 什麼時候用dfs? 短, 小, 最問題 而90%DFS的題, 要麼是排列, 要麼是組合 組合搜尋問題 Combination 問題模型:求出所有滿足條件的“組合” 判斷條件:組合中的元素是順序無關的 時間複雜度:與 2^n 相關 遞迴三要素 一般來說,如果面試官不特

演算法7-5:圖的遍歷——深度優先搜尋

http://www.dotcpp.com/oj/problem1702.html 題目描述 深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點v出發,訪問此頂點,然後依次從v的未被訪問的鄰接點出發

對於深度優先搜尋演算法的理解

1. dfs嘗試走遍可能的路線 所以一看到題目確定要使用dfs來解決的時候首先要在紙上畫出簡單的例子的樹,然後進行簡單的模擬呼叫dfs的過程,通過這顆簡單的樹可以清楚地瞭解呼叫的情況,從簡單的例子和自己的總結中看出有多少個平行的狀態,並且每個平行狀態退回來需要怎麼樣處理 其中確定了使用dfs處理

【DFS】不撞南牆不回頭—深度優先搜尋演算法[Deep First Search]

今天上午聽到,那個非常6+1的李詠先生因癌症去世 DFS演算法的基本模型 深度下,不撞南牆不回頭,就是一直往後找,知道沒有路了,向後返回。 想起一首民謠,《可能否》--木小雅 https://music.163.com/#/song?id=569214126 現在可能也

演算法總結-二叉樹的深度優先搜尋

1 遍歷的問題 二叉樹的前序遍歷 http://www.lintcode.com/zh-cn/problem/binary-tree-preorder-traversal/ 二叉樹的中序遍歷 http://www.lintcode.com/zh-cn/problem/b

演算法總結之深度優先搜尋

1 組合搜尋問題 子集 http://www.lintcode.com/zh-cn/problem/subsets/ 帶重複元素的子集 http://www.lintcode.com/zh-cn/problem/subsets-ii/ 數字組合 http://www

資料結構——圖(3)——深度優先搜尋演算法(DFS)思想

圖的遍歷 圖由頂點及其邊組成,圖的遍歷主要分為兩種: 遍歷所有頂點 遍歷所有邊 我們只討論第一種情況,即不重複的列出所有的頂點,主要有兩種策略:深度優先搜尋(DFS),廣度優先搜尋(BFS) 為了使深度和廣度優先搜尋的實現演算法的機制更容易理解,假設提

python 遞迴深度優先搜尋與廣度優先搜尋演算法模擬實現

一、遞迴原理小案例分析 (1)# 概述 遞迴:即一個函式呼叫了自身,即實現了遞迴 凡是迴圈能做到的事,遞迴一般都能做到! (2)# 寫遞迴的過程 1、寫出臨界條件2、找出這一次和上一次關係3、假設當前函式已經能用,呼叫自身計算上一次的結果,再求出本次的結果 (3)案例分析:求1+2+3+…+n的數和

演算法----圖的遍歷(深度優先搜尋DFS、廣度優先搜尋BFS)

圖的遍歷的定義:從圖的某個頂點出發訪問圖中所有的點,且每個頂點僅被訪問一次。 深度優先搜尋DFS: 準備:指定的起始點和終點,確定好當前點與鄰接點之間的偏移值、結束搜尋的條件、符合訪問的點所需條件、回溯處理; (1)若當前點的鄰接點有未被訪問的,則選一個進行訪問; (2)若當前點的鄰接點都不符合訪問條

黑白迷宮問題——深度優先搜尋演算法

2021年,九月,小w發現自己位於一個巨大的由黑格和白格組成的n行m列的迷宮中。 小w只能從白格走到黑格或從黑格走到白格, 小w找到了ljf,她想知道自己從每一個格子出發不回頭可以走多少個格子。 但是ljf忙於在ioi中虐場,把問題留給了你。 注意:原題是可以回頭,屬於連通圖問題

演算法7-4,7-5:圖的遍歷——深度優先搜尋(c語言)

[提交] [統計] [提問] 題目描述 深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點v出發,訪問此頂點,然後依次從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v有路徑相通的頂點都

三、【圖演算法深度優先搜尋(DFS)

圖演算法是個龐大的家族,其中大部分成員的主體框架都可以歸結於圖的遍歷。圖的遍歷需要訪問所有頂點一次且僅 一次,此外,圖遍歷同時還要訪問所有的邊一次且僅一次。經過一次遍歷,樹邊的頂點共同構成了原圖的一顆遍歷樹。 為防止對頂點的重複訪問,在遍歷的過程中,需要動態地設定各頂點的不同狀態,並且隨著遍

演算法學習--從深度優先搜尋到全排列問題(一)

直接進入主題,關於深度優先搜尋,發源於資料結構圖,起初是用來進行圖的遍歷,經過科研人員長時間的研究和總結,已經運用到實際的生產生活中去,用以解決需要大量重複、排列組合的相關問題。 參考書目: 《演算法導論》、《啊哈!演算法》、《資料結構(李建忠翻譯版)》。 關於基本資料結構圖的相關內

sameTree用深度優先搜尋判斷兩棵樹是否相同 #演算法#

Given two binary trees, write a function to check if they are the same or not. 給定兩個二叉樹,寫一個函式檢查它們是否相同。 Two binary trees are consider

小橙書閱讀指南(十二)——無向圖、深度優先搜尋和路徑查詢演算法

在計算機應用中,我們把一系列相連線的節點組成的資料結構,叫做圖。今天我們將要介紹它的一種形式——無向圖,以及針對這種結構的深度優先搜尋和路徑查詢演算法。 一、無向圖資料結構 介面: /** * 圖論介面 */ public interface Graph { /** * 頂點數

演算法7-4:圖的遍歷——深度優先搜尋(模板)

題目描述 深度優先搜尋遍歷類似於樹的先根遍歷,是樹的先根遍歷的推廣。其過程為:假設初始狀態是圖中所有頂點未曾被訪問,則深度優先搜尋可以從圖中的某個頂點v出發,訪問此頂點,然後依次從v的未被訪問的鄰接點出發深度優先遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到;若此時圖中尚