Cod sursa(job #1222800)

Utilizator Luncasu_VictorVictor Luncasu Luncasu_Victor Data 24 august 2014 14:02:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define MAX 100010

vector<int> Gr[MAX];
bool Use[MAX];
int N, M, E, Sol, L[MAX], R[MAX];

bool Dfs(int X) {
	int Y;
	if (Use[X]) return 0;
	Use[X] = 1;
	for (int i = 0; i < Gr[X].size(); i++) {
		Y = Gr[X][i];
		if (R[Y] == 0 || Dfs(R[Y])) {
			L[X] = Y;
			R[Y] = X;
			return 1;
		}
	}
	return 0;
}

int main() {
	int X, Y;

	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	
	scanf("%d %d %d", &N, &M, &E);
	for (int i = 1; i <= E; i++) {
		scanf("%d %d", &X, &Y);
		Gr[X].push_back(Y);
	}
	
	bool ok = 1;
	while (ok) {
		ok = 0;
		memset(Use, 0, sizeof(Use));
		for (int i = 1; i <= N; i++) {
			if (L[i] == 0 && Dfs(i)) {
				ok = 1;
				Sol++;
			}
		}
	}
	
	printf("%d\n", Sol);
	for (int i = 1; i <= N; i++) {
		if (L[i]) {
			printf("%d %d\n", i, L[i]);
		}
	}

	return 0;
}