POJ 1469 ZOJ1140 二分匹配裸题

很裸,左点阵n,右点阵m 问最大匹配是否为n

#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
vector <int> edge[103];
int pre[303];
bool vis[303];
int n, m;
bool dfs(int u) {
	for(int i = 0; i < (int)edge[u].size(); i++) {
		int v = edge[u][i];
		if(vis[v]) continue;
		vis[v] = 1;
		if(pre[v] == -1 || dfs(pre[v])) {
			pre[v] = u;
			return 1;
		}
	}
	return 0;
}
int main() {
	int i, cas;
	scanf("%d", &cas);
	while(cas--) {
		scanf("%d%d", &n, &m);
		int x, tp;
		for(i = 0; i < n; i++)
			edge[i].clear();
		for(i = 0; i < n; i++) {
			scanf("%d", &tp);
			while(tp--) {
				scanf("%d", &x);
				edge[i].push_back(--x);
			}
		}
		memset(pre, -1, sizeof(int)*m);
		int cnt = 0;
		for(i = 0; i < n; i++) {
			memset(vis, 0, sizeof(bool)*m);
			if(dfs(i)) cnt++;
			if(cnt == n) break;
		}
		printf("%s\n", cnt==n ? "YES" : "NO");

	}
	return 0;
}


你可能感兴趣的:(POJ 1469 ZOJ1140 二分匹配裸题)