月老的难题
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘。
现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭。
现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸福的家庭,月老准备促成尽可能多的幸福家庭,请你帮他找出最多可能促成的幸福家庭数量吧。
假设男孩们分别编号为1~n,女孩们也分别编号为1~n。
-
输入
-
第一行是一个整数T,表示测试数据的组数(1<=T<=400)
每组测试数据的第一行有两个整数n,K,其中男孩的人数与女孩的人数都是n。(n<=500,K<=10 000)
随后的K行,每行有两个整数i,j表示第i个男孩与第j个女孩有可能结成幸福的家庭。(1<=i,j<=n)
输出
- 对每组测试数据,输出最多可能促成的幸福家庭数量 样例输入
-
1 3 4 1 1 1 3 2 2 3 2
样例输出
-
2
#include <iostream> #include <string.h> using namespace std; #define MAXN (500 + 10) int n, k; struct Edge { int v, next; }edge[MAXN * MAXN]; int e, head[MAXN]; bool vis[MAXN]; int links[MAXN]; void add(int u, int v) { edge[e].v = v; edge[e].next = head[u]; head[u] = e++; } void init() { e = 0; memset(head, -1, sizeof(head)); memset(links, -1, sizeof(links)); } bool dfs(int u) { for (int i = head[u]; i != -1; i = edge[i].next) { if (!vis[edge[i].v]) { vis[edge[i].v] = true; if (links[edge[i].v] == -1 || dfs(links[edge[i].v])) { links[edge[i].v] = u; return true; } } } return false; } void solve() { int ans = 0; for (int i = 1; i <= n; i++) { memset(vis, false, sizeof(vis)); if (dfs(i)) { ans++; } } cout << ans << endl; } void input() { int t, u, v; cin >> t; while (t--) { cin >> n >> k; init(); for (int i = 0; i < k; i++) { cin >> u >> v; add(u, v); } solve(); } } int main() { std::ios::sync_with_stdio(false); input(); return 0; }
-
第一行是一个整数T,表示测试数据的组数(1<=T<=400)