Cod sursa(job #1708684)

Utilizator UPB_Darius_Rares_SilviuPeace my pants UPB_Darius_Rares_Silviu Data 27 mai 2016 19:49:17
Problema Cuplaj maxim in graf bipartit Scor 28
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <vector>
#include <bitset>
#define x first
#define y second
#define NMAX 10009
using namespace std;

int N, M, E, st[ NMAX ], dr[ NMAX ], sol;
bitset< NMAX > viz;
vector< int > G[NMAX];

int DFS(int node) {
    viz[ node ] = 1;
    for (vector<int>::iterator it = G[node].begin(); it != G[ node ].end(); ++it) {
        if (!dr[ *it ]) {
            st[ node ] = *it;
            dr[ *it ] = node;
            return *it;
        }
    }

    for (vector<int>::iterator it = G[node].begin(); it != G[ node ].end(); ++it) {
        if (!viz[ *it ] && DFS(*it) ) {
            st[ node ] = *it;
            dr[ *it ] = node;
            return *it;
        }
    }

    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\n", &x, &y);
        G[ x ].push_back( y );
    }

    bool done = 0;
    while (!done) {
        done = 1;

        viz.reset();
        for (int i = 1; i <= N; ++i) {
            if (!st[ i ] && !viz[ i ] && DFS( i )) {
                ++sol;
                done = 0;
            }
        }

    }

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

    return 0;
}