Cod sursa(job #1669619)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 30 martie 2016 21:19:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <vector>
#include <list>
#include <queue>
#include <cstring>
#include <set>
#include <cctype>
using namespace std;
 
#ifdef INFOARENA
#define ProblemName "cuplaj"
#endif
 
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
 
template <class T> void readNum(T &nr) {
    nr = 0;
    T sign = 1;
    char c;
    while (!isdigit(c = getchar()))
    if (c == '-')
        sign = -1;
    do {
        nr = nr * 10 + c - '0';
    } while (isdigit(c = getchar()));
    nr *= sign;
}
 
#define NMAX 10010
 
vector< vector<int> > G(NMAX);
vector<int> leftPair(NMAX, -1);
vector<int> rightPair(NMAX, -1);
vector<char> visited(NMAX);
 
char pairUp(int nod) {
    if (visited[nod])
        return 0;
    visited[nod] = 1;
    for (auto i : G[nod])
    if (rightPair[i] == -1) {
        rightPair[i] = nod;
        leftPair[nod] = i;
        return 1;
    }
    for (auto i : G[nod])
    if (pairUp(rightPair[i])) {
        rightPair[i] = nod;
        leftPair[nod] = i;
        return 1;
    }
    return 0;
}
 
int main() {
    assert(freopen(InFile, "r", stdin));
    assert(freopen(OuFile, "w", stdout));
    int N, M, E;
    readNum(N); readNum(M); readNum(E);
    while (E--) {
        int n1, n2;
        readNum(n1); readNum(n2);
        G[n1 - 1].push_back(n2 - 1);
    }
    char found = 1;
	int flow = 0;
    while (found) {
        found = 0;
        memset(&visited[0], 0, sizeof(visited[0]) * visited.size());
        for (int i = 0; i < N; i++)
		if (leftPair[i] == -1 && pairUp(i))
			flow += (found = 1);
    }
    printf("%d\n", flow);
    for (int i = 0; i < N; i++)
    if (leftPair[i] != -1)
        printf("%d %d\n", i + 1, leftPair[i] + 1);
    return 0;
}