Cod sursa(job #941179)

Utilizator howsiweiHow Si Wei howsiwei Data 18 aprilie 2013 07:37:03
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
#define ech(It, A) for (typeof(A.begin()) It = A.begin(); It != A.end(); ++It)

vector< vector<int> > adjl;
vector<int> match1;
vector<int> match2;
vector<bool> visited;

bool dfs( int v2 ) {
	if (match2[v2] == 0) return true;
	visited[v2] = true;
	int v1 = match2[v2];

	ech(it, adjl[v1]) { 
		if ( !visited[*it] && dfs(*it) ) {
			match1[v1] = *it;
			match2[*it] = v1;
			return true;
		}
	}
	return false;
}

int main() {
	ifstream fin("cuplaj.in");
	ofstream fout("cuplaj.out");
	int n, m, e;
	fin >> n >> m >> e;
	adjl.resize(n+1);
	match1.resize(n+1);
	match2.resize(m+1);
	visited.resize(m+1);

	for (int u, v, i = 0; i < e; ++i) {
		fin >> u >> v;
		adjl[u].push_back(v);
	}

	int cnt = 0;
	bool change;
	do {
		change = false;
		fill( visited.begin(), visited.end(), false );
		for (int i = 1; i <= n; ++i) {
			if (match1[i] == 0) {
				match2[0] = i;
				if (dfs(0)) ++cnt;
			}
		}
	} while (change);

	fout << cnt << '\n';
	for (int i = 1; i <= n; ++i) {
		if (match1[i] != 0)
			fout << i << ' ' << match1[i] << '\n';
	}
	return 0;
}