Cod sursa(job #1247843)

Utilizator smaraldaSmaranda Dinu smaralda Data 24 octombrie 2014 10:02:49
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;

const int NMAX = 1e4;

vector <int> graph[NMAX + 5];
int n, m, matched[NMAX + 5], left[NMAX + 5], right[NMAX + 5];

bool pairUp (int node) {
    if(matched[node])
        return 0;

    vector <int>::iterator it;

    matched[node] = 1;
    for(it = graph[node].begin(); it != graph[node].end(); ++ it)
        if(!left[*it] || pairUp(left[*it])) {
            right[node] = *it;
            left[*it] = node;
            return 1;
        }
    return 0;
}

int main() {
    freopen("cuplaj.in", "r", stdin);
    freopen("cuplaj.out", "w", stdout);
    int i, x, y, e, flag, card;

    scanf("%d%d%d", &n, &m, &e);
    for(i = 1; i <= e; ++ i) {
        scanf("%d%d", &x, &y);
        graph[x].push_back(y);
    }

    flag = 1;
    while(flag) {
        flag = 0;
        memset(matched, 0, sizeof(matched));
        for(i = 1; i <= n; ++ i)
            if(!right[i]) {
                if(pairUp(i))
                    flag = 1;
            }
    }

    card = 0;
    for(i = 1; i <= n; ++ i)
        if(right[i])
            ++ card;

    printf("%d\n", card);
    for(i = 1; i <= n; ++ i)
        if(right[i])
            printf("%d %d\n", i, right[i]);
    return 0;
}