#111-【二分圖x匈牙利演算法】尋找代表
阿新 • • 發佈:2018-12-11
Description
【問題描述】
某中學一共有n個社團,分別用1到n編號。
某中學一共有m個人,分別用1到m編號。每個人可以參加一個或多個社團,也可以不參加任何社團。
每個社團都需要選一個代表。我們希望更多的人能夠成為代表。
【輸入格式】
第一行輸入兩個數n和m。
以下n行每行若干個數,這些數都是不超過m的正整數。其中第i行的數表示社團i的全部成員。每行用一個0結束。
【輸出格式】
輸出最多的能夠成為代表的人數。
【輸入樣例】
4 4
1 2 0
1 2 0
1 2 0
1 2 3 4 0
【輸出樣例】
3
【註釋】
資料範圍
n,m<=200
匈牙利模板
#include <iostream> #include <cstring> #define SIZE 201 int link[SIZE], m; bool graph[SIZE][SIZE], visited[SIZE]; using namespace std; bool check(int x) // 匈牙利尋找可擴充套件路徑 { int i; for (i = 1; i <= m; ++i) { if ((graph[x][i]) && (!visited[i])) { visited[i] = true; if ((!link[i]) || (check(link[i]))) { link[i] = x; return true; } } } return false; } int main(void) { int i, res = 0, x, n; scanf("%d%d", &n, &m); for (i = 1; i <= n; ++i) { scanf("%d", &x); while (x) { graph[i][x] = true; scanf("%d", &x); } } for (i = 1; i <= n; ++i) { memset(visited, false, sizeof (visited)); if (check(i)) { ++res; // 找到一條,結果加一 } } printf("%d", res); return 0; }