Cod sursa(job #970722)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 7 iulie 2013 17:26:29
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>

using namespace std;

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

const int MAXN = 10005;

typedef vector<int> Graph[MAXN];
typedef vector<int> :: iterator IT;

Graph G;
vector <int> cuplaj(MAXN), pereche(MAXN);
bitset <MAXN> used;
int n, m, p, sol;

inline bool pairup(int node)
{
    if(used[node])
        return false;
    used[node] = true;
    for(IT it = G[node].begin(), fin = G[node].end(); it != fin ; ++ it)
        if(!pereche[*it] || pairup(pereche[*it]))
        {
            cuplaj[node] = *it;
            pereche[*it] = node;
            return true;
        }
    return false;
}

int main()
{
    cin >> n >> m >> p;
    for(int i = 1 ; i <= p ; ++ i)
    {
        int x, y;
        cin >> x >> y;
        G[x].push_back(y);
    }
    for( bool ok = true ; ok ; )
    {
        ok = false;
        used.reset();
        for(int i = 1 ; i <= n ; ++ i)
            if(!cuplaj[i])
                if(pairup(i))
                {
                    ++ sol;
                    ok = true;
                }
    }
    cout << sol << "\n";
    for(int i = 1 ; i <= n ; ++ i)
        if(cuplaj[i])
            cout << i << " " << cuplaj[i] << "\n";
    return 0;
}