hdu 2063

传送门

裸匈牙利算法
然后这个题就是很坑(这里边没说要多组数据,但是他!!!!有多组数据,然后, 他还卡longlong)
有些气愤,挑了好长时间的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iomanip>
#define int long long

using namespace std;
int a[501][501], v[501], match[501];
int k, m, n, ans;

int read() {
	int s = 0,f = 0;
	char ch = getchar();
	while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
	while (isdigit(ch)) s = s * 10 + (ch ^ 48), ch = getchar();
	return f ? -s : s;
}

bool go(int u) {
	for (int i = 1; i <= m; i++)
		if (a[u][i] && !v[i]) {
			v[i] = true;
			if (!match[i] || go(match[i])) {
				match[i] = u;
				return 1;
			}
		}
	return 0;
}

signed main() {
	scanf("%d", &k);
	while (k != 0) {
		n = read(), m = read();
		int x, y;
		for (int i = 1; i <= k; i++) {
			x = read(), y = read();
			a[x][y] = 1;
		}
		for (int i = 1; i <= n; i++) {
			memset(v, 0, sizeof(v));
			if (go(i)) ans++;
		}
		printf("%d\n",ans);
		ans = 0;
		memset(match, 0, sizeof(match));
		memset(a, 0, sizeof(a));
		scanf("%d", &k);
	}
}
posted @ 2019-07-17 20:46  Kersen  阅读(121)  评论(0编辑  收藏  举报