Cod sursa(job #1119035)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 24 februarie 2014 14:40:23
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <stdio.h>
#include <vector>
using namespace std;

#define Nmax 10005

vector <int> graph[Nmax];
int l[Nmax], r[Nmax], v[Nmax];
int n, m, e, c;

void read(){
	freopen("cuplaj.in", "r", stdin);
	int u, v;

	scanf("%d %d %d", &n, &m, &e);
	for (int i = 1; i <= e; ++i){
		scanf("%d %d", &u, &v);
		graph[u].push_back(v);
	}
	fclose(stdin);
}

int find(int u){
	if (v[u])
		return 0;
	v[u] = 1;
	vector <int>::iterator it;

	for (it = graph[u].begin(); it != graph[u].end(); ++it)
		if (!r[*it]){
			l[u] = *it;
			r[*it] = u;
			return 1;
		}
	for (it = graph[u].begin(); it != graph[u].end(); ++it)
		if (find(r[*it])){
			l[u] = *it;
			r[*it] = u;
			return 1;
		}
	return 0;
}

void hopcroftKarp(){
    bool change = true;

    while (change){
		change = false;
		for (int i = 1; i <= n; ++i)
			v[i] = 0;
		for (int i = 1; i <= n; ++i)
			if (!l[i])
				if (find(i)){
					++c;
					change = true;
				}
    }
}

void write(){
	freopen("cuplaj.out", "w", stdout);

	printf("%d\n", c);
	for (int i = 1; i <= n; ++i)
		if (l[i])
			printf("%d %d\n", i, l[i]);
	fclose(stdout);
}

int main(){
	read();
	hopcroftKarp();
	write();
}