深度優先搜尋版的匈牙利演算法
/****************************************************
> 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有路徑相通的頂點都被訪問到;若此時圖中尚