Cod sursa(job #2740418)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 12 aprilie 2021 21:31:57
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>

using namespace std;

#ifndef LOCAL

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

#define cin in
#define cout out

#endif //LOCAL

int n, m, e;

const int NMAX = 1e4 + 7;
const int INF = 1e9;

vector<int> adj[NMAX];

int pair_lft[NMAX];
int pair_rht[NMAX];

int dist[NMAX << 1];

queue<int> q;

bool bfs()
{
    for(int i = 1; i <= n; i++)
    {
        if(!pair_lft[i])
        {
            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_rht[v]] == INF)
            {
                dist[pair_rht[v]] = dist[u] + 1;
                q.push(pair_rht[v]);
            }
        }
    }

    return dist[0] != INF;
}

bool dfs(int u)
{
    if(u == 0) return true;
    for(auto v : adj[u])
        if(dist[pair_rht[v]] == 1 + dist[u])
            if(dfs(pair_rht[v]))
            {
                pair_rht[v] = u;
                pair_lft[u] = v;
                return true;
            }

    dist[u] = INF;
    return false;
}

vector<pair<int, int>> cups;
int HK()
{
    int matching = 0;
    while(bfs())
    {
        for(int u = 1; u <= n; u++)
            if(pair_lft[u] == 0)
                if(dfs(u))
                    matching++;

    }

    return matching;
}

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

    cout << HK() << '\n';
    for(int i = 1; i <= n; i++)
        if(pair_lft[i] != 0) cout << i << " " << pair_lft[i] << '\n';
}