Cod sursa(job #1394571)

Utilizator rootsroots1 roots Data 20 martie 2015 13:57:00
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>

#define MAXV 10001

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

int L, R, E;
vector <int> G[MAXV];
int lMatch[MAXV];
int solLMatch[MAXV];
int m = 0;
int M = 0;

inline void readAndBuild() {
    in >> L >> R >> E;
    
    int x, y;
    for (int e = 0; e < E; ++ e) {
        in >> x >> y;
        
        G[x].push_back(y);
    }
}

inline void backtracking(int node) {
    if (node > L) {
        if (M < m) {
            M = m;
            for (int i = 1; i <= R; ++ i) {
                solLMatch[i] = lMatch[i];
            }
        }
    } else {
        for (vector <int>::iterator it = G[node].begin(); it != G[node].end(); ++ it) {
            if (lMatch[*it] == 0) {
                lMatch[*it] = node;
                m ++;
                backtracking(node + 1);
                m --;
                lMatch[*it] = 0;
            }
        }
        
        backtracking(node + 1);
    }
}

inline void printResult() {
    out << M << '\n';
    for (int i  = 1; i <= R; ++ i) {
        if (solLMatch[i]) {
            out << solLMatch[i] << ' ' << i << '\n';
        }
    }
}

int main() {
    readAndBuild();
    backtracking(1);
    printResult();
    
    return 0;
}