Cod sursa(job #470601)

Utilizator ooctavTuchila Octavian ooctav Data 14 iulie 2010 19:54:11
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const char iname[] = "cuplaj.in";
const char oname[] = "cuplaj.out";

const int MAXN = 10001;

vector <int> G[MAXN];

int l[MAXN], r[MAXN], u[MAXN];
int N, M, cnt_edges, cuplaj;

void citi()
{
	scanf("%d %d %d", &N, &M, &cnt_edges);
    for (; cnt_edges --; )
    {
        int x, y;
        scanf("%d %d", &x, &y);
        G[x].push_back(y);
    }
}

int solutie(int x)
{
	if(u[x])
		return 0;
	u[x] = 1;
	for(vector<int> :: iterator it = G[x].begin() ; it != G[x].end() ; it++)
		if(!r[*it])
		{
			r[*it] = x;
			l[x] = *it;
			return 1;
		}
	for(vector<int> :: iterator it = G[x].begin() ; it != G[x].end() ; it++)
		if(solutie(*it))
		{
			r[*it] = x;
			l[x] = *it;
			return 1;
		}
	return 0;
}

void rezolva()
{
	for(int i = 1 ; i <= N ; i++)
		if(!l[i])
		{
			if(!solutie(i))
			{
				fill(u + 1, u + N + 1, 0);
				cuplaj += solutie(i);
			}
			else
				cuplaj++;
		}
}

void scrie()
{
	printf("%d\n", cuplaj);
    for(int i = 1 ; i <= N ; i++)
		if (l[i] > 0)
			printf("%d %d\n", i, l[i]);
}

int main(void)
{
    freopen(iname, "r", stdin);
    freopen(oname, "w", stdout);
	citi();
	rezolva();
	scrie();

    return 0;
}