Cod sursa(job #379106)

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

using namespace std;

#define MAXX 10010

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

int cupleaza(int nod) {
    if (viz[nod]) return 0;
    else viz[nod] = 1;
    
    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++) {
        memset(viz, 0, sizeof(viz));
        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;
}