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)