首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

0-1 矩陣每行每列唯一 1 的最大化問題:雙邊匹配 / N 皇後變體

     編輯:程式設計綜合問答

問題建模

給定 M×N 0-1 矩陣,可將 0 翻轉為 1 (或理解為選擇位置放置 1),要求最終每行、每列**恰好**一個 1,求最大化 1 的總數 (即最大匹配數)。

核心洞察:二分圖最大匹配

  • 行集合 U = {r1..rM},列集合 V = {c1..cN}。
  • 原矩陣中 a[i][j]=1 表示邊 (ri, cj) 可用 (或權重為 1)。
  • 目標:選擇最大邊集,使任意兩邊不共用端點 → **二分圖最大匹配**。
  • 最大匹配數 ≤ min(M, N)。

算法選擇

算法複雜度適用場景
匈牙利算法 (DFS 增廣路)O(V·E)中小規模 (M,N ≤ 500),代碼簡短
Hopcroft-Karp (BFS 分層 + DFS)O(√V · E)大規模稀疏圖,性能優
網絡流 (Dinic/ISAP)O(E√V) 或更好通用最大流模板,易擴展權重/費用

與 N 皇後關係

N 皇後要求任意兩皇后不同行、不同列、不同對角線。**本問題僅約束行列**,無對角線約束,故是 N 皇後的**子問題/簡化版**,可用二分圖匹配高效求解,而 N 皇後需回溯/位運算。

MATLAB 實現提示

% 構建鄰接矩陣
adj = double(A); % A 為原 0-1 矩陣
% 使用 MATLAB 內置最大匹配 (需工具箱) 或自寫匈牙利
matching = maxBipartiteMatching(adj); % 返回匹配對
maxOnes = length(matching);

結論

本質是**二分圖最大匹配**,而非 N 皇後。用匈牙利或 Hopcroft-Karp 算法可在多項式時間內求得最大 1 的個數及具體位置。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved