Cod sursa(job #2207371)

Utilizator MaligMamaliga cu smantana Malig Data 25 mai 2018 16:08:34
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include <bits/stdc++.h>

using namespace std;

#if 1
    #define pv(x) cout<<#x<<" = "<<(x)<<"; ";cout.flush()
    #define pn cout<<endl
#else
    #define pv(x)
    #define pn
#endif

#ifdef INFOARENA
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");
#else
    #define in cin
    #define out cout
#endif

using ll = long long;
using ull = unsigned long long;
using uint = unsigned int;
#define pb push_back
#define mp make_pair
const int NMax = 2e4 + 5;
const ll inf_ll = 1e18 + 5;
const int inf_int = 1e9 + 5;
const int mod = 100003;
using zint = int;

map< pair<int,int>, bool > edgeMap;
bool vis[NMax];
vector<int> adj[NMax];

bool dfs(int node, int dest) {
    if (node == dest) {
        return true;
    }

    vis[node] = true;

    for (int i = 0; i < (int)adj[node].size(); ++i) {
        int nxt = adj[node][i];
        if (vis[nxt]) {
            continue;
        }

        if (dfs(nxt, dest)) {
            adj[node].erase(adj[node].begin() + i);
            edgeMap[ {node, nxt} ] = true;
            edgeMap[ {nxt, node} ] = false;            
            adj[nxt].pb(node);
            return true;
        }
    }

    return false;
}

int main() {
    cin.sync_with_stdio(false);
    cin.tie(0);

    int N, M, E;
    in >> N >> M >> E;

    for (int i = 1;i <= E; ++i) {
        int x,y;
        in >> x >> y;
        y += N;
        // out << x << ' ' << y << '\n';
        adj[x].pb(y);
    }

    for (int i = 1;i <= N; ++i) {
        adj[N+M+1].pb(i);
    }

    for (int i = N+1; i <= N+M; ++i) {
        adj[i].pb(N+M+2);        
    }
    int source = N + M + 1;
    int dest = N + M + 2;

    int maxFlow = 0;
    while (dfs(source, dest)) {
        ++maxFlow;
        memset(vis, 0, sizeof(vis));
    }

    out << maxFlow << '\n';

    for (auto it : edgeMap) {
        if (it.second && 1 <= it.first.first && it.first.first <= N) {
            out << it.first.first << ' ' << it.first.second - N << '\n';
        }
    }

    return 0;
}