首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

POJ 1274 COURSES:二分圖最大匹配(匈牙利算法)

     編輯:C++ 入門

題目大意

N 頭奶牛,M 個牛棚。每頭奶牛願意在某些牛棚產奶。每棚最多容納一頭牛,每頭牛最多分一個棚。求最大匹配數。
N,M ≤ 200,經典二分圖最大匹配。

匈牙利算法(DFS 增廣路)


bool dfs(int u) {
    for (int v : G[u]) {
        if (vis[v]) continue;
        vis[v] = true;
        if (match[v] == -1 || dfs(match[v])) {
            match[v] = u;
            return true;
        }
    }
    return false;
}

int hungarian() {
    int ans = 0;
    fill(match, match+M+1, -1);
    for (int u=1; u<=N; u++) {
        fill(vis, vis+M+1, false);
        if (dfs(u)) ans++;
    }
    return ans;
}

完整代碼


#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;

const int MAXN = 205;
vector G[MAXN];
int match[MAXN], vis[MAXN];
int N, M;

int main() {
    while (~scanf("%d%d", &N, &M)) {
        for (int i=1; i<=N; i++) { G[i].clear(); }
        for (int i=1; i<=N; i++) {
            int cnt; scanf("%d", &cnt);
            for (int j=0; j

關鍵點

  • 左側奶牛 1..N,右側牛棚 1..M。
  • match[v] 記錄牛棚 v 匹配的奶牛。
  • 每輪 DFS 前重置 vis,防止重複訪問同一右側節點。
  • 時間複雜度 O(N*E),N,M≤200 完全足夠。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved