Re: [問題] 給一個m*n(m<=n)矩陣,每列取一個非零ꐠ…

看板C_and_CPP作者 (小安)時間13年前 (2011/05/23 21:22), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串2/4 (看更多)
如果問題是要找出一組 one-to-one 對應, 可以把問題轉成 Maximum Bipartite Matching, 然後用 Hangerian Algorithms(匈牙利演算法) 去找出一組解。 但是從你的題目敘述上看來, 你並不是只要找出一組解,而是要找出所有解。 根據 Wikipedia: http://en.wikipedia.org/wiki/Sharp-P-complete "How many perfect matchings are there for a given bipartite graph?" 此問題是個 #P-complete problem, 雖然此處是 perfect matching,和你的問題不完全相同, 但 perfect matching 可以視為你的問題中的一個特例, 連 perfect matching 都是 #P-complete, 可見你的問題至少也是 #P-complete。 這類問題如果只需要計算所有解的 "數量" 且數字不大時, (n<20) "也許" 還有機會用 DP 算出。複雜度大概 O( 2^n * ... ) 至於要算到 20*33,我個人是認為沒有辦法。 當然,如果 bipartie graph 本身非常的稀疏,那就又另當別論了。 順便一提,這種問題其實也可以發在 Prob_solve 板。 ※ 引述《QWWJDQ (夢想十足總是失足)》之銘言: : 給一個 3*4 矩陣 M, 如下: : A B C D E : a 1 1 0 1 0 : M = b 0 0 1 0 0 : c 0 1 0 0 1 : 其中每一列中,1代表可以對應,0代表不可對應。 : 例如:第一列 a 可以對應於 A, B, D,不可對應於C, E。 : 欲求 a,b,c 一一對應(one-to-one)於 A,B,C,D,E 的所有可能。 : 也就是有如下結果: : a b c, a b c, a b c, a b c, a b c : | | | | | | | | | | | | | | | : A C B, A C E, B C E, D C B, D C E : 共五種。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.114.78.231 ※ 編輯: tkcn 來自: 140.114.78.231 (05/23 21:28)

05/23 22:10, , 1F
感謝您詳細的回答,這真是個殘酷的壞消息。XD。。。
05/23 22:10, 1F

05/23 22:16, , 2F
假設矩陣M中,每列包含1的個數限制在5個以下呢?雖然複雜度高
05/23 22:16, 2F

05/23 22:17, , 3F
但是我猜這樣的M,很有可能會找不到解。。。>.<
05/23 22:17, 3F

05/23 22:24, , 4F
所以可以用匈牙利判斷是否有解
05/23 22:24, 4F
文章代碼(AID): #1Dsb-pBS (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Dsb-pBS (C_and_CPP)