Cod sursa(job #1646822)

Utilizator qwertyuiTudor-Stefan Berbinschi qwertyui Data 10 martie 2016 17:51:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");

#define MAXN 50005

vector < vector <int> > edge;
int used[MAXN], Left[MAXN], Right[MAXN];
int N, M, E;

bool link(int node)
{
	used[node] = 1;

	for (int i = 0; i <(int) edge[node].size(); ++i)
        if (Right[edge[node][i]] == 0)
		{
			Right[edge[node][i]] = node;
			Left[node] = edge[node][i];
			return 1;
		}
	for (int i = 0; i <(int) edge[node].size(); ++i)
		if (!used[Right[edge[node][i]]] && link(Right[edge[node][i]]))
		{
            Left[node] = edge[node][i];
            Right[edge[node][i]] = node;
            return 1;
		}

	return 0;

}

int main()
{
    fin >>N >>M >>E;

    edge.resize(N+1);

    for (int i = 1; i <= E; ++i)
	{
        int x, y;
        fin >>x >>y;
        edge[x].push_back(y);
	}

	int ok = 1;

    do
    {
        ok = 1;
        fill(used, used+N+1, 0);

        for(int i = 1; i <= N; ++i)
            if(Left[i] == 0 && link(i))
				ok=0;
    }
    while(ok == 0);


    ok = 0;
    for (int i = 1; i <= N; ++i)
		if (Left[i] != 0)
			++ok;

	fout <<ok <<'\n';

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