Cod sursa(job #2260542)

Utilizator Victor_InczeVictor Incze Victor_Incze Data 15 octombrie 2018 09:32:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
#define MAXN 10005

using namespace std;

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

int l[MAXN], u[MAXN], r[MAXN], cuplaj, n, m, mm, x, y;
vector <int> g[MAXN];

int pairup(int x)
{
    if (u[x])
        return 0;
    u[x]=1;
    for (int i=0; i<g[x].size(); i++)
        if (r[g[x][i]]==0)
        {
            l[x]=g[x][i];
            r[g[x][i]]=x;
            return 1;
        }
    for (int i=0; i<g[x].size(); i++)
        if (pairup(r[g[x][i]]))
        {
            l[x]=g[x][i];
            r[g[x][i]]=x;
            return 1;
        }
    return 0;
}

int main()
{
    in >> n >> m >> mm;
    for (int i=1; i<=mm; i++)
    {
        in >> x >> y;
        g[x].push_back(y);
    }
    /*for (int i=1; i<=n; i++)
        if (l[i]==0)
        {
            if (pairup(i)==0)
            {
                memset(u,0,sizeof(u));
                cuplaj+=pairup(i);
            }
            else
                cuplaj++;
        }*/
    for (int change=1; change;)
    {
        change=0;
        memset(u,0,sizeof(u));
        for (int i=1; i<=n; i++)
            if (l[i]==0)
                change|=pairup(i);
    }
    for (int i=1; i<=n; i++)
        cuplaj+=(l[i]>0);
    out << cuplaj << '\n';
    for (int i=1; i<=n; i++)
        if (l[i]>0)
            out << i << " " << l[i] << '\n';
    return 0;
}