過山車 【二分圖匹配】
阿新 • • 發佈:2018-12-18
## **題目描述**:
RPG girls今天和大家一起去遊樂場玩,終於可以坐上夢寐以求的過山車了。可是,過山車的每一排只有兩個座位,而且還有條不成文的規矩,就是每個女生必須找個個男生做partner和她同坐。但是,每個女孩都有各自的想法,舉個例子把,Rabbit只願意和XHD或PQK做partner,Grass只願意和linle或LL做partner,PrincessSnow願意和水域浪子或偽酷兒做partner。考慮到經費問題,boss劉決定只讓找到partner的人去坐過山車,其他的人,嘿嘿,就站在下面看著吧。聰明的Acmer,你可以幫忙算算最多有多少對組合可以坐上過山車嗎?
思路
匈牙利演算法的裸題,每次得注意臨接矩陣的初始化,防止多次使用臨接矩陣時未進行初始化倒置答案錯誤;匈牙利演算法,感覺就是dfs判斷有無其他可以相連的邊,不斷的騰出位置,也是個不斷試探的過程!
程式碼
#include <bits/stdc++.h> using namespace std; #define MAX_N 550 int mat[MAX_N][MAX_N], vis[MAX_N], link[MAX_N], k, n, m; bool dfs(int n) { for(int i = 1; i<=m; i++) { if(mat[n][i] && !vis[i]) { vis[i] = 1; if(link[i] == -1 || dfs(link[i])) { link[i] = n; return 1; } } } return 0; } int hungury() { int ans = 0; for(int i = 1; i<=n; i++) { memset(vis, 0, sizeof(vis)); if(dfs(i)) ans++; } return ans; } int main() { while(cin >> k, k) { cin >> n >> m; memset(mat, 0, sizeof(mat)); memset(link, -1, sizeof(link)); for(int i = 1; i<=k; i++) { int x, y; cin >> x >> y; mat[x][y] = 1; } cout << hungury() << endl; } return 0; }