Cod sursa(job #2670685)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 10 noiembrie 2020 15:15:24
Problema Cuplaj maxim in graf bipartit Scor 52
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m, e;

const int NMAX = 10007;

const int INF = 1e9;

vector<int> adj[NMAX];

int pair_l[NMAX];
int pair_r[NMAX];

int dist[2 * NMAX];

queue<int> q;

bool bfs()
{
    for(int i = 1; i <= n; i++)
    {
        if(pair_l[i] == 0) {
            dist[i] = 0;
            q.push(i);
        }
        else
            dist[i] = INF;
    }
    dist[0] = INF;

    while(!q.empty())
    {
        int u = q.front(); q.pop();
        for(auto v : adj[u])
        {
            if(dist[pair_r[v]] == INF)
            {
                dist[pair_r[v]] = dist[u] + 1;
                q.push(pair_r[v]);
            }
        }
    }

    return dist[0] != INF;
}

bool dfs(int u)
{
    if(u != 0)
    {
        for(auto v : adj[u])
        {
            if(dist[pair_r[v]] == 1 + dist[u])
            {
                if(dfs(pair_r[v]) == true)
                {
                    pair_r[v] = u;
                    pair_l[u] = v;
                    return true;
                }
            }
        }
        dist[u] = INF;
        return false;
    }
    return true;
}

vector<pair<int, int>> cups;
int HopcroftKarp()
{
    int matching = 0;

    while(bfs())
    {
        for(int u = 1; u <= n; u++)
        {
            if(pair_l[u] == 0)
            {
                if(dfs(u))
                {
                    //cout << u << " " << pair_l[u] << endl;
                    cups.push_back(make_pair(u, pair_l[u]));
                    matching++;
                }
            }
        }
    }

    return matching;
}

int main()
{
    in >> n >> m >> e;
    for(int i = 0; i < e; i++)
    {
        int x, y; in >> x >> y;
        adj[x].push_back(y);
    }

    out << HopcroftKarp() << endl;
    sort(cups.begin(), cups.end());
    for(auto e : cups)
        out << e.first << " " << e.second << endl;
}