861. 二分图的最大匹配
生活随笔
收集整理的這篇文章主要介紹了
861. 二分图的最大匹配
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
861. 二分圖的最大匹配
給定一個二分圖,其中左半部包含 n1 個點(編號 1~n1),右半部包含 n2 個點(編號 1~n2),二分圖共包含 m 條邊。
數(shù)據(jù)保證任意一條邊的兩個端點都不可能在同一部分中。
請你求出二分圖的最大匹配數(shù)。
二分圖的匹配:給定一個二分圖 G,在 G 的一個子圖 M 中,M 的邊集 {E} 中的任意兩條邊都不依附于同一個頂點,則稱 M 是一個匹配。
二分圖的最大匹配:所有匹配中包含邊數(shù)最多的一組匹配被稱為二分圖的最大匹配,其邊數(shù)即為最大匹配數(shù)。
輸入格式
第一行包含三個整數(shù) n1、 n2 和 m。
接下來 m 行,每行包含兩個整數(shù) u 和 v,表示左半部點集中的點 u 和右半部點集中的點 v 之間存在一條邊。
輸出格式
輸出一個整數(shù),表示二分圖的最大匹配數(shù)。
數(shù)據(jù)范圍
1≤n1,n2≤500,
1≤u≤n1,
1≤v≤n2,
1≤m≤105
輸入樣例:
2 2 4 1 1 1 2 2 1 2 2輸出樣例:
2代碼:
#include <bits/stdc++.h> using namespace std;const int N = 510, M = 1e5 + 10;int n1, n2, m; int h[N], e[M], ne[M], idx; // match[j]=a,表示女孩j的現(xiàn)有配對男友是a int match[N]; // st[]數(shù)組我稱為臨時預(yù)定數(shù)組,st[j]=a表示一輪模擬匹配中,女孩j被男孩a預(yù)定了。 bool st[N];int res;void add(int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++; }bool find(int x) {for (int i = h[x]; i != -1; i = ne[i]){int j = e[i];//如果在這一輪模擬匹配中,這個女孩尚未被預(yù)定if (!st[j]){st[j] = true;//如果女孩j沒有男朋友,或者她原來的男朋友能夠預(yù)定其它喜歡的女孩。配對成功if (match[j] == 0 || find(match[j])){match[j] = x;return true;}}}return false; }int main() {cin >> n1 >> n2 >> m;memset(h, -1, sizeof h);while (m--){//存邊只存一邊就行了,雖然是無向圖。int a, b;cin >> a >> b;add(a, b);}for (int i = 1; i <= n1; i++){//因為每次模擬匹配的預(yù)定情況都是不一樣的所以每輪模擬都要初始化memset(st, false, sizeof st);// 當(dāng)前的i必定是沒有對象的if (find(i))res++;}cout << res << endl;return 0; }總結(jié)
以上是生活随笔為你收集整理的861. 二分图的最大匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Binning
- 下一篇: 利用python编写手机脚本