Cod sursa(job #379105)

Utilizator savimSerban Andrei Stan savim Data 30 decembrie 2009 17:23:11
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define MAXX 10010

int n, m, e, p, q, sol;
int cuplaj[MAXX];
vector <int> G[MAXX];

int cupleaza(int nod) {
    int len = G[nod].size();
    for (int i = 0; i < len; i++)
        if (!cuplaj[G[nod][i]]) {
            cuplaj[G[nod][i]] = nod;
            sol++;
            return 1;
        }
        
    for (int i = 0; i < len; i++)
        if (cuplaj[G[nod][i]] != nod && cupleaza(cuplaj[G[nod][i]])) {
            cuplaj[G[nod][i]] = nod;
            return 1;
        }
        
    return 0;
}

int main() {
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    
    scanf("%d %d %d", &n, &m, &e);
    for (; e; e--) {
        scanf("%d %d", &p, &q);
        G[p].push_back(q);
    }
    
    for (int i = 1; i <= n; i++)
        cupleaza(i);

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

    return 0;
}