poj 3041

二分图匹配

#include <iostream>
#include <vector>
#include <cstring>

using namespace std;

const int MAX_N = 505;
const int MAX_K = 10005;

int n, k, V;
int r[MAX_K], c[MAX_K];

int match[MAX_K];
bool used[MAX_K];

vector<int> G[MAX_K];

void add_edge(int u, int v) {
	G[u].push_back(v);
	G[v].push_back(u);
}

bool dfs(int v) {
	used[v] = true;
	for(int i=0; i<G[v].size(); i++) {
		int u = G[v][i], w = match[u];
		if(w<0 || !used[w] && dfs(w)) {
			match[v] = u;
			match[u] = v;
			return true;
		}
	}
	return false;
}

int bipartite_matching() {
	int res = 0;
	memset(match, -1, sizeof(match));
	for(int v=0; v<V; v++) {
		if(match[v] < 0) {
			memset(used, 0, sizeof(used));
			if(dfs(v))
				res++;
		}
	}
	return res;
}

void solve() {
	V = 2 * n;
	for(int i=0; i<k; i++)
		add_edge(r[i]-1, n+c[i]-1);
		
	printf("%d\n", bipartite_matching());
}

int main() {
	
	scanf("%d%d", &n, &k);
	for(int i=0; i<k; i++)
		scanf("%d%d", &r[i], &c[i]);
		
	solve();
	
	return 0;
}


posted @ 2016-10-11 14:53  StevenLuke  阅读(145)  评论(0编辑  收藏  举报