Cod sursa(job #2138159)

Utilizator popabogdanPopa Bogdan Ioan popabogdan Data 21 februarie 2018 13:40:44
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

#define Nmax 10005

using namespace std;

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

int N, M, E;
int L[Nmax], R[Nmax];
vector <int> G[Nmax];
bool used[Nmax];

bool pairup(int node)
{
    if(used[node])
        return false;
    used[node] = true;
    for(auto it : G[node])
        if(!R[it])
        {
            L[node] = it;
            R[it] = node;
            return true;
        }
    for(auto it : G[node])
        if(pairup(R[it]))
        {
            L[node] = it;
            R[it] = node;
            return true;
        }
    return false;
}

int main()
{
    fin >> N >> M >> E;
    while(E--)
    {
        int x, y;
        fin >> x >> y;
        G[x].push_back(y);
    }
    bool ok = true;
    while(ok)
    {
        ok = false;
        memset(used, false, sizeof(used));
        for(int i = 1; i <= N; i++)
            if(L[i] == 0)
                if(pairup(i))
                    ok = true;
    }
    int cnt = 0;
    for(int i = 1; i <= N; i++)
        cnt += L[i] > 0;
    fout << cnt << "\n";
    for(int i = 1; i <= N; i++)
        if(L[i])
            fout << i << " " << L[i] << "\n";
    return 0;
}