Cod sursa(job #2496570)

Utilizator melutMelut Zaid melut Data 21 noiembrie 2019 01:17:35
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
#include <vector>


using namespace std;


char const *in_file = "cuplaj.in";
char const *out_file = "cuplaj.out";


ifstream Read(in_file);
ofstream Write(out_file);


void ReadInput(
    vector<vector<uint32_t>> &nodes
) {
    uint32_t n;
    uint32_t m;
    uint32_t e;

    Read >> n;
    Read >> m;
    Read >> e;

    nodes.resize(max(n, m));

    uint32_t node1;
    uint32_t node2;

    for (uint32_t i = 0; i < e; ++i) {
        Read >> node1;
        Read >> node2;

        nodes[node1 - 1].push_back(node2 - 1);
    }
}


bool DFS(
    vector<vector<uint32_t>> const &nodes,
    vector<int32_t> &to,
    vector<int32_t> &from,
    vector<bool> &vis,
    uint32_t const node
) {
    if (vis[node]) {
        return false;
    }
    vis[node] = true;

    uint32_t to_node;

    for (uint32_t i = 0; i < nodes[node].size(); ++i) {
        to_node = nodes[node][i];

        if (from[to_node] == -1 ||
            DFS(nodes, to, from, vis, from[to_node])
        ) {
            to[node] = to_node;
            from[to_node] = node;
            return true;
        }
    }

    return false;
}


void Solve(
    vector<vector<uint32_t>> const &nodes
) {
    vector<int32_t> to(nodes.size(), -1);
    vector<int32_t> from(nodes.size(), -1);

    uint32_t i, j;

    vector<bool> vis(nodes.size());
    bool found;

    do {
        found = false;
        fill(vis.begin(), vis.end(), false);

        for (i = 0; i < nodes.size(); ++i) {
            if (to[i] == -1) {
                found |= DFS(nodes, to, from, vis, i);
            }
        }
    } while (found);

    uint32_t _count = 0;

    for (i = 0; i < nodes.size(); ++i) {
        if (to[i] != -1) {
            ++_count;
        }
    }

    Write << _count << '\n';

    for (i = 0; i < nodes.size(); ++i) {
        if (to[i] != -1) {
            Write << i + 1 << ' ';
            Write << to[i] + 1 << '\n';
        }
    }
}


int main() {
    vector<vector<uint32_t>> nodes;

    ReadInput(nodes);

    Solve(nodes);

    Read.close();
    Write.close();

    return 0;
}