Cod sursa(job #626856)

Utilizator sebii_cSebastian Claici sebii_c Data 28 octombrie 2011 14:33:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 10010

using namespace std;

vector<int> A[NMAX];
int l[NMAX], r[NMAX], viz[NMAX];

int pair_up(int n)
{
    if (viz[n])
	return 0;
    viz[n] = 1;
    vector <int>::iterator it;
    for (it=A[n].begin(); it!=A[n].end(); ++it) 
	if (!r[*it]) {
	    l[n] = *it;
	    r[*it] = n;
	    return 1;
	}
    for (it=A[n].begin(); it!=A[n].end(); ++it)
	if (pair_up(r[*it])) {
	    l[n] = *it;
	    r[*it] = n;
	    return 1;
	}
    return 0;
}

int main()
{
    freopen("cuplaj.out", "w", stdout);
    int i, x, y, change;
    ifstream fin("cuplaj.in");
    int N, M, E;
    fin >> N >> M >> E;
    for (i=1; i<=E; ++i) {
	fin >> x >> y;
	A[x].push_back(y);
    }
    fin.close();
    for (change = 1; change; ) {
	change = 0;
	memset(viz, 0, sizeof(viz));
	for (i=1; i<=N; ++i) 
	    if (!l[i])
		change |= pair_up(i);
    }
    int result = 0;
    for (i=1; i<=N; ++i)
	result += (l[i] > 0);
    printf("%d\n", result);
    for (i=1; i<=N; ++i)
	if (l[i])
	    printf("%d %d\n", i, l[i]);
    return 0;
}