Cod sursa(job #562677)

Utilizator mottyMatei-Dan Epure motty Data 23 martie 2011 17:55:53
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <vector>

using namespace std;

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

const int N = 10001;

int n, m;
int dr[N];
int st[N];

bool viz[N];

vector <int> g[N];

void Read()
{
    int e;

    in >> n >> m >> e;

    while (e--)
    {
        int a, b;

        in >> a >> b;
        g[a].push_back(b);
    }
}

bool Match(int node)
{
    if (viz[node])
        return false;

    viz[node] = true;

    for (int i = 0; i < g[node].size(); ++i)
        if (!st[g[node][i]])
        {
            st[g[node][i]] = node;
            dr[node] = g[node][i];

            return true;
        }

    for (int i = 0; i < g[node].size(); ++i)
        if (Match(dr[g[node][i]]))
        {
            st[g[node][i]] = node;
            dr[node] = g[node][i];

            return true;
        }

    return false;
}

void Solve()
{
    for (int i = 1; i <= n; ++i)
    {
        memset(viz, 0, sizeof(viz));
        Match(i);
    }
}

void Print()
{
    int result = 0;

    for (int i = 1; i <= n; ++i)
        if(dr[i])
            ++result;

    out << result << "\n";

    for (int i = 1; i <= n; ++i)
        if(dr[i])
            out << i << " " << dr[i] << "\n";
}

int main()
{
    Read();
    Solve();
    Print();

    return 0;
}