Cod sursa(job #2471206)

Utilizator Leonard123Mirt Leonard Leonard123 Data 10 octombrie 2019 16:22:20
Problema Cuplaj maxim in graf bipartit Scor 32
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include<fstream>
#include<cstring>
#include <vector>
using namespace std;



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

#define MAXN  10005
#define FOR(i, a, b)  for (int i = (int)(a); i <= (int)(b); ++ i)
#define FORI(i, V)    for (vector <int>::iterator i = (V).begin(); i != (V).end(); ++ i)

vector <int> G[MAXN];

int l[MAXN], r[MAXN], u[MAXN];


int pairup(const int n)
{
    if (u[n])  return 0;
    u[n] = 1;
    FORI (i, G[n]) if (!r[*i]) {
        l[n] = *i;
        r[*i] = n;
        return 1;
    }
    FORI (i, G[n]) if (pairup(r[*i])) {
        l[n] = *i;
        r[*i] = n;
        return 1;
    }
    return 0;
}

int main(void)
{
    int n, m, cnt_edges;
    cin>>n>>m>>cnt_edges;
    for (; cnt_edges --; )
    {
        int x, y;
        cin>>x>>y;
        G[x].push_back(y);
    }
    int cuplaj = 0;
    FOR (i, 1, n) if (!l[i]) {
        if (!pairup(i)) {
            memset(u, 0, sizeof(u));
            cuplaj += pairup(i);
        }
        else
            cuplaj ++;
    }
    cout<<cuplaj<<'\n';
    FOR (i, 1, n) if (l[i] > 0)
        cout<<l[i]<<' ';

    return 0;
}