Cod sursa(job #1620597)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 29 februarie 2016 11:05:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
///Problema Cuplaj - InfoArena ( www.infoarena.ro/problema/cuplaj )
#include <cstdio>
#include <vector>
#include <cstring>

#define in "cuplaj.in"
#define out "cuplaj.out"
#define NMAX 10007
#define pb push_back

using namespace std;
int n, m, E, viz[NMAX], ok = 1, sol[2][NMAX], sum;
vector <int> g[2][NMAX];

bool cuplez(const int &nod)
{
    int sze = g[0][nod].size();
    if(viz[nod]) return 0;
    viz[nod] = 1;
    for(int i =0; i< sze; ++i)
    {
        int tmp = g[0][nod][i];
        if(sol[1][tmp]) continue;
        sol[0][nod] = tmp;
        sol[1][tmp] = nod;
        return 1;
    }
    for(int i =0; i< sze; ++i)
    {
        int tmp = g[0][nod][i];
        if(!cuplez(sol[1][tmp])) continue;
        sol[0][nod] = tmp;
        sol[1][tmp] = nod;
        return 1;
    }
    return 0;
}

inline void citire()
{
	int nod1, nod2;
	scanf("%d %d %d", &n, &m, &E);
	for(int i = 1; i<= E; ++i)
	{
        scanf("%d %d", &nod1, &nod2);
        g[0][nod1].pb(nod2);
        g[1][nod2].pb(nod1);
	}
}
inline void solve()
{
    while(ok)
    {
		ok = 0;
		memset(viz, 0, sizeof(viz));
		for(int i = 1; i<= n; ++i)
		{
			if(sol[0][i]) continue;
			if(cuplez(i))
			{
				++sum;
				ok = 1;
			}
		}
    }
}
inline void afisare()
{
	printf("%d\n", sum);
	for(int i = 1; i<= n; ++i)
	{
		if(sol[0][i]) printf("%d %d\n", i, sol[0][i]);
	}
}

int main()
{
    freopen(in, "r", stdin);
    freopen(out, "w", stdout);
    citire();
    solve();
    afisare();
    return 0;
}