當前位置:首頁 » 操作系統 » 匈牙利演算法c

匈牙利演算法c

發布時間: 2023-07-23 18:55:58

演算法和軟體的關系,程序員應該學習哪些演算法

一.基本演算法:

枚舉. (poj1753,poj2965)

貪心(poj1328,poj2109,poj2586)

遞歸和分治法.

遞推.

構造法.(poj3295)

模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)

二.圖演算法:

圖的深度優先遍歷和廣度優先遍歷.

最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
拓撲排序 (poj1094)

二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)

最大流的增廣路演算法(KM演算法). (poj1459,poj3436)

三.數據結構.

串 (poj1035,poj3080,poj1936)

排序(快排、歸並排(與逆序數有關)、堆排) (poj2388,poj2299)

簡單並查集的應用.

哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
哈夫曼樹(poj3253)



trie樹(靜態建樹、動態建樹) (poj2513)

四.簡單搜索

深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)

廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)

簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)

五.動態規劃

背包問題. (poj1837,poj1276)

型如下表的簡單DP(可參考lrj的書 page149):
E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列) (poj3176,poj1080,poj1159)
C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學

組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關系.
(POJ3252,poj1850,poj1019,poj1942)
數論.
1.素數與整除問題
2.進制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
計算方法.
1.二分法求解單調函數相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.

幾何公式.

叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)

多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
凸包. (poj2187,poj1113)

中級(校賽壓軸及省賽中等難度):
一.基本演算法:

C++的標准模版庫的應用. (poj3096,poj3007)

較為復雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)

二.圖演算法:

差分約束系統的建立和求解. (poj1201,poj2983)

最小費用最大流(poj2516,poj2516,poj2195)

雙連通分量(poj2942)

強連通分支及其縮點.(poj2186)

圖的割邊和割點(poj3352)

最小割模型、網路流規約(poj3308)

② NOI考試的內容是什麼

1 時間復雜度(漸近時間復雜隱塌讓度的嚴格定義,NP問題,時間復雜度的分析方法,主定理)
2 排序演算法(平方排序演算法的應用,Shell排序,快速排序,歸並排序,時間復雜度下界,三種線性時間排序,外部排序)
3 數論(整除,集合論,關系,素數,進位制,輾轉相除,擴展的輾轉相除,同餘運算,解線性同餘方程,中國剩餘定理)
4 指針(鏈表,搜索判重,鄰接表,開散列,二叉樹的表示灶局,多叉樹的表示)
5 按位運算(and,or,xor,shl,shr,一些應用)
6 圖論(圖論模型的建立,平面圖,歐拉公式與五色定理,求強連通分量,求割點和橋,歐拉迴路,AOV問題,AOE問題,最小生成樹的三種演算法,最短路的三種算 法,標號法,差分約束系統,驗證二分圖衫嘩,Konig定理,匈牙利演算法,KM演算法,穩定婚姻系統,最大流演算法,最小割最大流定理,最小費用最大流演算法)
7 計算幾何(平面解幾及其應用,向量,點積及其應用,叉積及其應用,半平面相交,求點集的凸包,最近點對問題,凸多邊形的交,離散化與掃描)
8 數據結構(廣度優先搜索,驗證括弧匹配,表達式計算,遞歸的編譯,Hash表,分段Hash,並查集,Tarjan演算法,二叉堆,左偏樹,斜堆,二項堆,二叉查找樹,AVL,Treap,Splay,靜態二叉查找樹,2-d樹,線段樹,二維線段樹,矩形樹,Trie樹,塊狀鏈表)
9 組合數學(排列與組合,鴿籠原理,容斥原理,遞推,Fibonacci數列,Catalan數列,Stirling數,差分序列,生成函數,置換,Polya原理)
10 概率論(簡單概率,條件概率,Bayes定理,期望值)
11 矩陣(矩陣的概念和運算,二分求解線性遞推方程,多米諾骨牌棋盤覆蓋方案數,高斯消元)
12 字元串處理(KMP,後綴樹,有限狀態自動機,Huffman編碼,簡單密碼學)
13 動態規劃(單調隊列,凸完全單調性,樹型動規,多叉轉二叉,狀態壓縮類動規,四邊形不等式)
14 博奕論(Nim取子游戲,博弈樹,Shannon開關游戲)
15 搜索(A*,ID,IDA*,隨機調整,遺傳演算法)
16 微積分初步(極限思想,導數,積分,定積分,立體解析幾何)

③ 請教做ACM的常用演算法..還是菜鳥

初期:
一.基本演算法:
(1)枚舉. (poj1753,poj2965)
(2)貪心(poj1328,poj2109,poj2586)
(3)遞歸和分治法.
(4)遞推.
(5)構造法.(poj3295)
(6)模擬法.(poj1068,poj2632,poj1573,poj2993,poj2996)
二.圖演算法:
(1)圖的深度優先遍歷和廣度優先遍歷.
(2)最短路徑演算法(dijkstra,bellman-ford,floyd,heap+dijkstra)
(poj1860,poj3259,poj1062,poj2253,poj1125,poj2240)
(3)最小生成樹演算法(prim,kruskal)
(poj1789,poj2485,poj1258,poj3026)
(4)拓撲排序 (poj1094)
(5)二分圖的最大匹配 (匈牙利演算法) (poj3041,poj3020)
(6)最大流的增廣路演算法(KM演算法). (poj1459,poj3436)
三.數據結構.
(1)串 (poj1035,poj3080,poj1936)
(2)排序(快排、歸並排(與逆序數有關)、堆排) (poj2388,poj2299)
(3)簡單並查集的應用.
(4)哈希表和二分查找等高效查找法(數的Hash,串的Hash)
(poj3349,poj3274,POJ2151,poj1840,poj2002,poj2503)
(5)哈夫曼樹(poj3253)
(6)堆
(7)trie樹(靜態建樹、動態建樹) (poj2513)
四.簡單搜索
(1)深度優先搜索 (poj2488,poj3083,poj3009,poj1321,poj2251)
(2)廣度優先搜索(poj3278,poj1426,poj3126,poj3087.poj3414)
(3)簡單搜索技巧和剪枝(poj2531,poj1416,poj2676,1129)
五.動態規劃
(1)背包問題. (poj1837,poj1276)
(2)型如下表的簡單DP(可參考lrj的書 page149):
1.E[j]=opt{D+w(i,j)} (poj3267,poj1836,poj1260,poj2533)
2.E[i,j]=opt{D[i-1,j]+xi,D[i,j-1]+yj,D[i-1][j-1]+zij} (最長公共子序列)
(poj3176,poj1080,poj1159)
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最優二分檢索樹問題)
六.數學
(1)組合數學:
1.加法原理和乘法原理.
2.排列組合.
3.遞推關系.
(POJ3252,poj1850,poj1019,poj1942)
(2)數論.
1.素數與整除問題
2.進制位.
3.同餘模運算.
(poj2635, poj3292,poj1845,poj2115)
(3)計算方法.
1.二分法求解單調函數相關知識.(poj3273,poj3258,poj1905,poj3122)
七.計算幾何學.
(1)幾何公式.
(2)叉積和點積的運用(如線段相交的判定,點到線段的距離等). (poj2031,poj1039)
(3)多邊型的簡單演算法(求面積)和相關判定(點在多邊型內,多邊型是否相交)
(poj1408,poj1584)
(4)凸包. (poj2187,poj1113)
中級:
一.基本演算法:
(1)C++的標准模版庫的應用. (poj3096,poj3007)
(2)較為復雜的模擬題的訓練(poj3393,poj1472,poj3371,poj1027,poj2706)
二.圖演算法:
(1)差分約束系統的建立和求解. (poj1201,poj2983)
(2)最小費用最大流(poj2516,poj2516,poj2195)
(3)雙連通分量(poj2942)
(4)強連通分支及其縮點.(poj2186)
(5)圖的割邊和割點(poj3352)
(6)最小割模型、網路流規約(poj3308, )
三.數據結構.
(1)線段樹. (poj2528,poj2828,poj2777,poj2886,poj2750)
(2)靜態二叉檢索樹. (poj2482,poj2352)
(3)樹狀樹組(poj1195,poj3321)
(4)RMQ. (poj3264,poj3368)
(5)並查集的高級應用. (poj1703,2492)
(6)KMP演算法. (poj1961,poj2406)
四.搜索
(1)最優化剪枝和可行性剪枝
(2)搜索的技巧和優化 (poj3411,poj1724)
(3)記憶化搜索(poj3373,poj1691)

五.動態規劃
(1)較為復雜的動態規劃(如動態規劃解特別的施行商問題等)
(poj1191,poj1054,poj3280,poj2029,poj2948,poj1925,poj3034)
(2)記錄狀態的動態規劃. (POJ3254,poj2411,poj1185)
(3)樹型動態規劃(poj2057,poj1947,poj2486,poj3140)
六.數學
(1)組合數學:
1.容斥原理.
2.抽屜原理.
3.置換群與Polya定理(poj1286,poj2409,poj3270,poj1026).
4.遞推關系和母函數.

(2)數學.
1.高斯消元法(poj2947,poj1487, poj2065,poj1166,poj1222)
2.概率問題. (poj3071,poj3440)
3.GCD、擴展的歐幾里德(中國剩餘定理) (poj3101)
(3)計算方法.
1.0/1分數規劃. (poj2976)
2.三分法求解單峰(單谷)的極值.
3.矩陣法(poj3150,poj3422,poj3070)
4.迭代逼近(poj3301)
(4)隨機化演算法(poj3318,poj2454)
(5)雜題.
(poj1870,poj3296,poj3286,poj1095)
七.計算幾何學.
(1)坐標離散化.
(2)掃描線演算法(例如求矩形的面積和周長並,常和線段樹或堆一起使用).
(poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多邊形的內核(半平面交)(poj3130,poj3335)
(4)幾何工具的綜合應用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
高級:
一.基本演算法要求:
(1)代碼快速寫成,精簡但不失風格
(poj2525,poj1684,poj1421,poj1048,poj2050,poj3306)
(2)保證正確性和高效性. poj3434
二.圖演算法:
(1)度限制最小生成樹和第K最短路. (poj1639)
(2)最短路,最小生成樹,二分圖,最大流問題的相關理論(主要是模型建立和求解)
(poj3155, poj2112,poj1966,poj3281,poj1087,poj2289,poj3216,poj2446
(3)最優比率生成樹. (poj2728)
(4)最小樹形圖(poj3164)
(5)次小生成樹.
(6)無向圖、有向圖的最小環
三.數據結構.
(1)trie圖的建立和應用. (poj2778)
(2)LCA和RMQ問題(LCA(最近公共祖先問題) 有離線演算法(並查集+dfs) 和 在線演算法
(RMQ+dfs)).(poj1330)
(3)雙端隊列和它的應用(維護一個單調的隊列,常常在動態規劃中起到優化狀態轉移的
目的). (poj2823)
(4)左偏樹(可合並堆).
(5)後綴樹(非常有用的數據結構,也是賽區考題的熱點).
(poj3415,poj3294)
四.搜索
(1)較麻煩的搜索題目訓練(poj1069,poj3322,poj1475,poj1924,poj2049,poj3426)
(2)廣搜的狀態優化:利用M進制數存儲狀態、轉化為串用hash表判重、按位壓縮存儲狀態、雙向廣搜、A*演算法. (poj1768,poj1184,poj1872,poj1324,poj2046,poj1482)
(3)深搜的優化:盡量用位運算、一定要加剪枝、函數參數盡可能少、層數不易過大、可以考慮雙向搜索或者是輪換搜索、IDA*演算法. (poj3131,poj2870,poj2286)
五.動態規劃
(1)需要用數據結構優化的動態規劃.
(poj2754,poj3378,poj3017)
(2)四邊形不等式理論.
(3)較難的狀態DP(poj3133)
六.數學
(1)組合數學.
1.MoBius反演(poj2888,poj2154)
2.偏序關系理論.
(2)博奕論.
1.極大極小過程(poj3317,poj1085)
2.Nim問題.
七.計算幾何學.
(1)半平面求交(poj3384,poj2540)
(2)可視圖的建立(poj2966)
(3)點集最小圓覆蓋.
(4)對踵點(poj2079)
八.綜合題.
(poj3109,poj1478,poj1462,poj2729,poj2048,poj3336,poj3315,poj2148,poj1263)

Dp狀態設計與方程總結

1.不完全狀態記錄

<1>青蛙過河問題

<2>利用區間dp

2.背包類問題

<1> 0-1背包,經典問題

<2>無限背包,經典問題

<3>判定性背包問題

<4>帶附屬關系的背包問題

<5> + -1背包問題

<6>雙背包求最優值

<7>構造三角形問題

<8>帶上下界限制的背包問題(012背包)

3.線性的動態規劃問題

<1>積木游戲問題

<2>決斗(判定性問題)

<3>圓的最大多邊形問題

<4>統計單詞個數問題

<5>棋盤分割

<6>日程安排問題

<7>最小逼近問題(求出兩數之比最接近某數/兩數之和等於某數等等)

<8>方塊消除游戲(某區間可以連續消去求最大效益)

<9>資源分配問題

<10>數字三角形問題

<11>漂亮的列印

<12>郵局問題與構造答案

<13>最高積木問題

<14>兩段連續和最大

<15>2次冪和問題

<16>N個數的最大M段子段和

<17>交叉最大數問題

4.判定性問題的dp(如判定整除、判定可達性等)

<1>模K問題的dp

<2>特殊的模K問題,求最大(最小)模K的數

<3>變換數問題

5.單調性優化的動態規劃

<1>1-SUM問題

<2>2-SUM問題

<3>序列劃分問題(單調隊列優化)

6.剖分問題(多邊形剖分/石子合並/圓的剖分/乘積最大)

<1>凸多邊形的三角剖分問題

<2>乘積最大問題

<3>多邊形游戲(多邊形邊上是操作符,頂點有權值)

<4>石子合並(N^3/N^2/NLogN各種優化)

7.貪心的動態規劃

<1>最優裝載問題

<2>部分背包問題

<3>乘船問題

<4>貪心策略

<5>雙機調度問題Johnson演算法

8.狀態dp

<1>牛仔射擊問題(博弈類)

<2>哈密頓路徑的狀態dp

<3>兩支點天平平衡問題

<4>一個有向圖的最接近二部圖

9.樹型dp

<1>完美伺服器問題(每個節點有3種狀態)

<2>小胖守皇宮問題

<3>網路收費問題

<4>樹中漫遊問題

<5>樹上的博弈

<6>樹的最大獨立集問題

<7>樹的最大平衡值問題

<8>構造樹的最小環

④ 參加ACM大賽應該准備哪些課程

課程:

(1)基本演算法: 二分,分治,貪心

(2) 離散數學離散數學動態規劃

(3) 搜索演算法:深度優先 搜索,廣度優先搜A*演算法 ,阿爾法貝塔剪枝

(4)數據結構:線段樹, 樹狀數組,並查集,Trie圖

(5)圖論問題:最小生成樹 最短路 強連通分量、橋和割點

(6)網路流演算法:基本的網路流演算法,Dinic演算法,帶上下界的網路流,最小費用流

(7)計算幾何:線與線求交,線與面求交,求凸包,半平面求交等

(8) 離散數學,高等數學,線性代數,初等數論,計算幾何

(9)計算機專業英語

(10)C++;基礎的遞歸、枚舉演算法

(4)匈牙利演算法c擴展閱讀:

1.參賽隊伍最多由三名參賽隊員組成。

2.競賽中命題10題左右,試題描述為英文,比賽時間為5個小時,前四個小時可以實時看到排名,最後一小時封榜,無法看到排名。

3.競賽可以使用的語言:Java, C, C++, Kotlin 和 Python。

4.重點考察選手的演算法和程序設計能力,不考察實際工程中常用的系統編程,多線程編程等等;

5.選手可攜帶任何非電子類資料,包括書籍和列印出來的程序等,部分賽區會對選手攜帶的紙質資料做限制。

6.評委負責將結果(正確或出錯的類型)通過網路盡快返回給選手,除此之外不提供任何額外幫助;

7.每個題目對應一種顏色的氣球,通過該題目的隊伍會得到對應顏色氣球。每道題目第一支解決掉它的隊還會額外獲得一個「FIRST PROBLEM SOLVED」的氣球。

⑤ 兩個人之間的匹配度,兩個人容貌上匹配程度

提起兩個人之間的匹配度,大家都知道,有人問兩個人容貌上匹配程度,另外,還有人想問匹配的圖的定義,你知道這是怎麼回事?其實如何測試兩個人的匹配度,下面就一起來看看兩個人容貌上匹配程度,希望能夠幫助到大家!

兩個人之間的匹配度

1、兩個人之間的匹配度:兩個人容貌上匹配程度

男才女貌,應該不是指外國妞般配的兩個人有什麼特徵。

2、兩個人之間的匹配度:匹配的圖的定義

設有M個工人x1,x2,…,xm,和N項工作y1,y2,…,yn,規定每個工人至多做一項工作,而每項工作至多分配一名工人去做。由於種種原因,每個工人只能勝任其中的一項或幾項工作。問應怎樣分配才能使盡可能多的工人分配到他勝任的工作。這個問題稱為人員分配問題。為什麼感覺有些人很般配。

人員分配問題可以用圖的語言來表述。令X={x1,x2,…,xm},Y={y1,y2,…,yn},構造二分圖G=(X,Y,E)如下:兩個人很配是什麼意思。

對於1≤i≤m,1≤j≤n,當且僅當工人xi勝任工作yi時,G中有一條邊xiyi,於是人員分配問題就成為在G中求一個匹配的問題。測試兩人婚姻匹配度。

求匹配常用匈牙利演算法,它的基本思想是:對於已知的匹配M,從X中的任一選定的M非飽和點出發,用標號法尋找M增廣鏈。如果找到M增廣鏈,則M就可以得到增廣;否則從X中另一個M非飽和點出發,繼續尋找M增廣鏈。重復這個過程直到G中不存在增廣鏈結束,此時的匹配就是G的匹配。這個算常稱為匈牙利演算法,因為這里介紹的尋找增廣鏈的標號方法是由匈牙科學者Egerváry最早提出來的。測兩個人的戀愛匹配指數。

理解了這個演算法,就不難寫出人員分配問題的解答了。在給出程序之前,先做一些假設:兩個人匹配的意思是什麼。

為了簡單起見,假設工人數等於工作數,即N=M,且N≤,這里,N也可以看作是二分圖的|X|和|Y|。測量情侶匹配度。

數據從文件input.txt中讀入,首先是N和|E|,下面|E|行每行兩個數(I,J),表示工人I可以勝任工作J,即二分圖中的邊xiyj。

結果輸出到文件output.txt,行是匹配數s,下面s行每行兩個數(I,J),表示分配工人I做工作J,即匹配邊xiyj。對於上面的人員分配問題,如果還考慮到工人做工的效率,就可以提出所謂的分派問題:應該怎樣分配才能使總的效率?看上去很般配的兩個人。

同上一節,我們可以構造一個二分圖G,如果把工人xi做工作yi的效率wij看作是G中邊xiyi的權,則分派問題就相當於在賦權二分圖G中求一個全匹配。

由線性規劃的知識,求二分圖G的權匹配,只需在匈牙利演算法的基礎上少許改進即可。它的基本思想是,對二分圖的頂點編號,然後根據編號構造一個新的二分圖G』,把求G的權匹配轉換為求G』的完美匹配。情侶照片測匹配度。

下面的這條定理是這個演算法的理論基礎。

定理:設M是賦權圖(權非負)的完全二分圖G=(V,E)的一個完美匹配,這里M是E的子集。如果M滿足:對G的任意一個完美匹配M’,均有M的邊權值之和大於M’邊的權值之和,則M是G的權匹配。兩個人很般配是什麼樣的。

下面,給出求權匹配的程序。輸入文件中首先是N和|E|,下面|E|行每行三個數(I,J,W),表示工人I做工作J的效率是W。程序輸出包括每個工人的選擇和的總效益。其它假設參見上一節的演算法假設。這個算問題:FJOI-信封問題

John先生晚上寫了n封信,並相應地寫了n個信封將信裝好,准備寄出。但是,第二天John的兒子SmallJohn將這n封信都拿出了信封。不幸的是,SmallJohn無法將拿出的信正確地裝回信封中了。對象匹配度測試。

將SmallJohn所提供的n封信依次編號為1,2,…,n;且n個信封也依次編號為1,2,…,n。假定SmallJohn能提供一組信息:第i封信肯定不是裝在信封j中。請編程幫助SmallJohn,盡可能多地將信正確地裝回信封。其中n≤。測試兩人般配程度。

例如,有4封信,而且封信不是裝在信封1、2和3中,第2封信不是裝在信封2和3中,則可以確定的封信裝在信封4中,而且第二封信則裝在信封1中。但這些條件還不足以確定第三封和第四封信的位置。看了這道題目,感覺上和小學數學競賽中的邏輯推理題如出一轍,而邏輯推理題的一般是表上作業法。

就以前面的例子為例,根據條件,可以得到如下信息:

戀愛契合度測試姓名。

1×××別人說你倆挺配的是什麼意思。

2××表格1

由於每一行每一列都應該只有一個√,因此,可以確定封信裝在信封4中,於是可以得到:

1×××√戀愛匹配度測試免費。

2×××4×如何測試情侶匹配度。

然後,發現第二行有3個×,因此剩下一個肯定是√,於是就可以得出第二封信則裝在信封1中:夫妻相匹配度測試。

測名字看兩人配不配。

1×××√

2√×××

現在,第3行和第4行都只有兩個×,因此無法確定它們放在那個信封里。

這樣我們就得到了一個初步的演算法:在程序中建立一個二維表格,首先,根據條件填入若干個×,然後,檢查所有還未確定的行和列,看有沒有一行(列)中有n–1個×,如果沒有,就結束;否則,把剩下的那一個空格填上√,並且填了√的那一行(列)的其它位置都填上×。

這種方法雖然很容易想到,但卻有針對這個方法的反例,例如:測試戀愛匹配度。

圖表3一個反例情侶匹配度測試免費。

圖中上半部分的頂點表示「信」,下半部分的頂點表示「信封」,如果信i可能放在信封j中,則在信i和信封j之間連一條邊。由於每個頂點的度數都大於或等於2,即每行每列都至少有兩個空位,故前面的演算法無法進行任何推理,而事實卻並非如此,比如說中間的那封信就只能放在中間的那個信封里。測測我和他能否在一起。

正是這個反例,使我們需要另闢蹊徑。進一步分析可以發現,信和信封之間的關系,是一種一一對應的關系,這是因為一封信只能放到一個信封里,而一個信封也只能裝一封信。而從信息學的角度來看,這種一一對應的關系,也可以看作是二分圖的匹配關系。

令X={x1,x2,…,xm},Y={y1,y2,…,yn},構造二分圖G=(X,Y,E),當且僅當信i可以放到信封j中,G中存在邊xiyj。這樣,任何一種信的分案,都可以看作是圖G的一個完美匹配。例如上圖就有且僅有如下兩種完美匹配:

圖表4所有的完美匹配

由於中間的那條匹配邊在兩個完美匹配中都出現了,因此我們認為這條匹配邊是「確定的」,換句話說,這條邊所代表的關系也是確定的。容易看出,當且僅當對於G的所有完美匹配M,都存在一條匹配邊xiyj,則可以確定信i可以放到信封j中。

這樣,我們就從匹配的角度建立了一個新的模型。那麼,這個模型要如何求解呢?戀愛適配度計算。

我們當然不能枚舉出G所有的完美匹配,然後再去求它們邊的交集——這和搜索就沒什麼分別。在這里,我們需要對這個模型再做一個小小的轉換:我們發現,條件「對於G的所有完美匹配M,都存在一條匹配邊xiyj」,等價於「如果圖G存在完美匹配,而刪除圖G中的一條邊xiyj得到的圖G』中卻不存在完美匹配」。例如,左下圖刪除了一條「關鍵邊」,故不存在完美匹配,而右下圖刪除的是一條「非關鍵邊」,故存在完美匹配。什麼叫做匹配。

圖表5刪邊的例子

從表面上看,這個演算法的時間復雜度似乎仍然很高。因為圖G中最多有n2條邊,每次試著刪除一條邊,又需要O(n3)的時間復雜度求一次完美匹配。總的復雜度高達O(n5)。查詢兩人的匹配度。

實際上,我們可以先找到圖G的一個完美匹配M,這樣,刪邊就只需考慮匹配邊了(因為刪除非匹配邊得到G』,M仍然是G』的完美匹配)。這樣,只需刪除n條邊,時間復雜度就降到了O(n4)。

再進一步分析,刪除一條邊以後,沒有必要重新找完美匹配,只需檢查可不可以找到新的增廣鏈就可以了。這樣,時間復雜度就進一步降到了O(n3)。問題:CTSC-丘比特的煩惱

隨著的不斷發展,人與人之間的感情越來越功利化。最近,愛神丘比特發現,愛情也已不再是完全純潔的了。這使得丘比特很是苦惱,他越來越難找到合適的男女,並向他們射去丘比特之箭。於是丘比特千里迢迢遠赴中國,找到了掌管東方人愛情的神——月下老人,向他求教。

月下老人告訴丘比特,純潔的愛情並不是不存在,而是他沒有找到。在東方,人們講究的是緣分。月下老人只要做一男一女兩個泥人,在他們之間連上一條紅線,那麼它們所代表的人就會相愛——無論他們身處何地。而丘比特的愛情之箭只能射中兩個距離相當近的人,選擇的范圍自然就小了很多,不能找到真正的有緣人。

丘比特聽了月下老人的解釋,茅塞頓開,回去之後用了人間的改造了自己的,使得丘比特之箭的射程大大增加。這樣,射中有緣人的機會也增加了不少。

情人節(Valentine’sday)的午夜零時,丘比特開始了自己的工作。他選擇了一組數目相等的男女,到他們互相之間的緣分大小,並依次箭,使他們產生愛意。他希望能選擇的方法,使被他選擇的每一個人被射中一次,且每一對被射中的人之間的緣分的和。

當然,無論丘比特怎麼改造自己的,總還是存在缺陷的。首先,的射程盡管增大了,但畢竟還是有限的,不能像月下老人那樣,做到「千里姻緣一線牽」。其次,無論怎麼改造,箭的軌跡終歸只能是一條直線,也就是說,如果兩個人之間的連線段上有別人,那麼莫不可向他們丘比特之箭,否則,按月下老人的話,就是「亂點鴛鴦譜」了。

作為一個凡人,你的任務是運用先進的計算機為丘比特找到的方案。

輸入文件行為正整數k,表示丘比特之箭的射程,第二行為正整數n(n<30),隨後有2n行,表示丘比特選中的人的信息,其中前n行為男子,後n行為女子。每個人的信息由兩部分組成:他的姓名和他的位置。姓名是長度小於20且僅包含字母的字串,忽略大小寫的區別,位置是由一對整數表示的坐標,它們之間用空格分隔。格式為Namexy。輸入文件剩下的部分描述了這些人的緣分。每一行的格式為。Name1和Name2為有緣人的姓名,p是他們之間的緣分值(p為小於等於的正整數)。以一個End作為文件結束標志。每兩個人之間的緣分至多隻被描述一次。如果沒有被描述,則說明他們緣分值為1。

輸出文件僅一個正整數,表示每一對被射中的人之間的緣分的總和。這個和應當是的。題目中出現了三類物體和兩種關系,我們一個個的來分析:

丘比特的箭,它有一個屬性是射程,

男人和女人,他們的屬性包括名字和位置,

男人和女人之間的關系,這個關系是他們倆的緣分值,

箭與男女的關系,如果兩人的距離不超過箭的射程,並無他人阻擋,則可能被箭射中。題目就是要求一種射箭的方案,使得所有被射中的男女的緣分和。

這個問題很像是要求一個二分圖的權匹配。因為男人和女人分屬兩個,而且同性之間沒有任何關系,因此是一個二分圖。而把緣分值記做邊上的權,則緣分和,就對應了這個二分圖中的一個權匹配。

要注意的是,題目中雖然說明沒有被描述的男女之間緣分值為1,但這並不代表所得到的二分圖是完全二分圖。因為在構圖的過程中,我們必須還考慮到箭的射程等因素——如果兩人的距離超過了箭的射程,則他倆註定無緣了。

這時問題就來了,因為題目中除了要求緣分和之外,還要求「被丘比特選擇的每一個人都要被射中一次」。

你可能會覺得,要緣分和越大,當然被射中的人越多越好,其實並不是這樣。例如:

圖表6一個反例

如果要求權匹配,則會選擇匹配邊AD,緣分和為10。但由於每個人都要被射中一次,因此我們只能選擇AC和BD,緣分和為2。

換句話說,對於這個例子,正確答案應該是2,而權匹配的值卻是10。這說明,這道題目和簡單的權匹配還是有區別的,因為題目再要求權值的同時,還要求是一個完美匹配,我們稱之為「完美」的權匹配。

那麼,這道題是否就不能用權匹配來做了呢?先別急,我們再來回顧一下求權匹配的演算法:我們通過對頂點編號,將圖G轉化為G』,然後在把求G的權匹配轉換為求G』的完美匹配——這里好像就是求完美匹配,但對於上面的那個例子,又為什麼不呢?

原來,對於上面的例子,在標號過後,新的圖G』中加入了一條新的邊BC,而這條邊的權值是0,在圖G』中的完美匹配,實際上是AD和BC,對應到圖G中,就是邊AD了。

因此,如果我們預先把BC的邊的權值設為-∞,再求圖中的權匹配,就不會再有問題了。

更一般的,如果要求二分圖的「完美」的權匹配,只需將原圖中沒有的邊的權值設為-∞,就可以了。問題:IPSC-Magic

一個的術師上台表演,跟著他的是一位漂亮的女助手。術師先從他的術帽中拽出了幾只兔子,接著他又從女助手的圍巾中變出了一束鮮花,,他把女助手鎖在一個看上去空著的箱子里。然後,術師選了一個觀眾來配合一個表演:他在一個桌子上擺出N張牌(所有N張牌兩兩不同,且N為奇數)。術師讓這位自願者走上講台從中選出(N+1)/2張牌,其餘的牌都在術師的帽子里永遠的消失了。術師在選出的牌上方晃了晃手,接著他選出其中一張交給那一位自願者,自願者向觀眾展示了手中的這張牌,隨後又將其在自己的衣袋裡。那位女助手從箱子里放出來後,來到桌前也在剩下的(N+1)/2-1張牌上方晃了晃手,馬上就說出了自願者衣袋中的是什麼牌。

這是為什麼呢?我們先看一下下面這張表,這是N=5的情況:

自願者選的牌術師選的牌助手所看到的牌

1,2,2

1,2,4

1,2,5

1,3,3

1,3,5

1,4,5

2,3,3

2,3,5

2,4,4

3,4,4

其中,自願者選的牌-術師選的牌=助手所看到的牌。表中包括了自願者選牌的所有可能性,它們兩兩不同。而助手所看到的牌,也是兩兩不同的。

首先,術師和他的助手都要記住這張表。這樣,當助手看到的牌是2,4時,她就可以肯定自願者選的牌是2,4,5,且術師選的牌就是5。

現在,告訴你n的值,要你求出這張表。其中n≤15。為了便於分析,我們令M表示從N張牌中選取(N+1)/2張牌的方案數,顯然,從這N張牌中選出(N+1)/2-1張牌的方案數也是M。

我們先從枚舉的角度入手,下面給出兩種枚舉的方法:

對於自願者的每種選牌的方案,枚舉術師所選的牌。

如何測試兩個人的匹配度

對於自願者的每種選牌的方案,所對應的助手看到的牌。

方案一需要M次決策,每次決策中有N種選擇;方案二同樣需要M次決策,而每次決策的可以有M種選擇。從這點上來看,方案一要好得多。、

可是方案一所表現出來的「自願者的選牌的方案」和「術師所選的牌」之間的關系並不是一一對應的關系,對於自願者不同的選牌的方案,術師可以選擇相同的牌。

而方案二中所表現出的關系正是一一對應的關系,因為題目要求對於自願者不同的選牌的方案,助手看到的牌必須不同。

前面已經提到過,從信息學的角度來看,一一對應,也可以看作是一種二分圖的匹配的關系。因此,方案二更容易讓人聯繫到匹配。

令X=自願者的選牌的方案集,Y=助手看到的牌的,構造二分圖G=(X,Y,E),當且僅當時,G中存在邊xiyj。這樣,就把原問題轉換成求圖G的一個完美匹配。

下面問題又來了。首先,二分圖的頂點高達2M個,當N=15時,M接近,而求匹配的復雜度為O(M3),這樣高的復雜度,如何能夠承受?

注意到這個圖是一個稀疏圖,一共只有MN條邊。而稀疏二分圖匹配的復雜度也可以表示成O(|V|×|E|)。因此,時間復雜度應該是O(),基本上可以承受了。

另外,由於這是稀疏圖,我們用鄰接表來存儲,則空間復雜度僅為O(NM),同樣可以承受。

要說明的是,這道題目也可以用構造法以更好的效率,但不如匹配容易想到。具體的構造方法這里就不給出了,讀者可以自己想一想。問題:OOPC-神秘之山

M個人在追一隻奇怪的小動物。眼看就要追到了,那小東西卻一溜煙躥上一座神秘的山。眾人抬頭望去那山看起來就是這個樣子:

圖表7樣例示意圖

那山由N+1條線段組成。各個端點從左到右編號為0…N+1,即x<x[i+1](0≤i≤n)。而且有y[0]=y[n+1]=0。

根據經驗來說那小東西極有可能在1…N中的某個端點。有趣的是大家很快發現了原來M恰好等於N,這樣,他們決定每人選一個點,看看它是否在躲那裡。

一開始,他們都在山腳下,第i個人的位置是(s,0)。他們每人選擇一個中間點(x,0),先以速度w水平走到那裡,再一口氣沿直線以速度c爬到他的目的地。由於他們的數學不好,他們只知道如何選擇一個的整數來作為中間點的橫坐標x。而且很明顯,路線的任何一個部分都不能在山的上方(他們又不會飛)。

他們不希望這次再失敗了,因此隊長決定要尋找一個方案,使得一個到達目的地的人盡量早點到。他們該怎麼做呢?

其中1≤N≤,0≤x,y,s≤,1≤c<w≤。行包含一個整數N。以下N+2行每行,包含兩個整數xi和yi,代表相應端點的坐標。以下N行每行包含3個整數:ci,wi和si,代表第i個人的爬山速度,行走速度和初始位置輸出一個人到達目的地的最早可能時間,四捨五入到小數點後兩位。

樣例輸入

樣例輸出

1.43

樣例說明

在這里例子中,個人先到(5.0)再爬到端點2;第二個人直接爬到端點3;第三個人先到(4.0)再爬到端點1。如下圖:

圖表8樣例的解答題目中的數據繁多復雜,我們先把他們提出來一個個分析:

人,共n個,與之有關的有初始橫坐標s,速度w和c

山頭,共n個,與之有關的有坐標x和y

根據這些信息,可以得到,人和山頭的關系:t[I,J],表示第i個人到達山頭j所需的最短時間。

題目中已經指明是一個人負責一個山頭,這顯然是一個一一對應的關系,因此,我們可以從二分圖的匹配的角度來考慮這個問題。

那麼,這道題目屬於哪一種匹配呢?是簡單的匹配,還是權匹配,或者是前面所提到的「完美」權匹配呢?

其實都不是。因為一般的權匹配,一個匹配的權的定義是該匹配中所有邊上權的和,而這道題目,一個匹配的權是指該匹配的邊上權值的值。題目要求這個值最小,我們暫且稱之為「最小匹配」。

直接求解似乎不太方便。換一個角度,如果我們給出一個時間,就可以用完美匹配的演算法來判斷能否在這個時間內完成所有的工作。

具體的來說,對於給定的二分圖G和時間T,我們可以導出新的圖G』,G』中所有邊的權都不超過T。如果G』存在完美匹配,則所有工作可以在T時間內完成,否則則不能。

這樣,一個簡單的演算法就誕生了:依次增加T,知道求出一個完美匹配為止。由於二分圖中的邊不會超過n2,因此T最多增加n2次,而每次增加T的值,需要O(n2)的時間來找增廣鏈,這樣總的時間復雜度就是O(n4)。

我們還可以採用二分查找的方法來尋找這個T,這樣的演算法時間復雜度就可以降到為O()。

以上就是與兩個人容貌上匹配程度相關內容,是關於兩個人容貌上匹配程度的分享。看完兩個人之間的匹配度後,希望這對大家有所幫助!

熱點內容
非結構式存儲 發布:2025-03-15 14:49:09 瀏覽:580
緩存下載記錄 發布:2025-03-15 14:48:21 瀏覽:115
src怎麼找配置 發布:2025-03-15 14:18:32 瀏覽:693
下載u盤加密3000 發布:2025-03-15 14:18:29 瀏覽:798
sqlnotbetween 發布:2025-03-15 13:52:38 瀏覽:438
游戲伺服器刪了會怎麼樣 發布:2025-03-15 13:41:42 瀏覽:166
微商城系統源碼 發布:2025-03-15 13:31:32 瀏覽:593
什麼是平演算法 發布:2025-03-15 13:18:36 瀏覽:841
seleniumpython教程 發布:2025-03-15 13:11:19 瀏覽:626
c語言對前端 發布:2025-03-15 13:04:01 瀏覽:782