Cod sursa(job #1563112)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 5 ianuarie 2016 18:11:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>

using namespace std;

const int Mn = 10005;

int N,M,E,cnt;
int A[Mn],B[Mn];
bool used[Mn],b;
vector< int > G[Mn];

bool match(int node)
{
    if (used[node])
       return 0;

    used[node] = 1;

    for (int i = 0;i < int(G[node].size());i++)
        if (!B[G[node][i]])
        {
            A[node] = G[node][i];
            B[G[node][i]] = node;
            return 1;
        }

    for (int i = 0;i < int(G[node].size());i++)
        if (match(B[G[node][i]]))
        {
            A[node] = G[node][i];
            B[G[node][i]] = node;
            return 1;
        }

    return 0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

    scanf("%d %d %d",&N,&M,&E);

    while (E--)
    {
        int x,y;

        scanf("%d %d",&x,&y);
        G[x].push_back(y);
    }

    do
    {
        b = 0;
        memset(used,0,sizeof(used));

        for (int i = 1;i <= N;i++)
            if (!A[i])
               b |= match(i);

    }while (b);

    for (int i = 1;i <= N;cnt += int(A[i] > 0),i++);

    printf("%d\n",cnt);

    for (int i = 1;i <= N;i++)
        if (A[i])
           printf("%d %d\n",i,A[i]);

  return 0;
}