Cod sursa(job #3330228)

Utilizator GabiRB1Rafael GabiRB1 Data 18 decembrie 2025 08:44:19
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <bits/stdc++.h>
using namespace std;

int n, m;
unordered_map <int, int> cap[20005];
vector <int> v[20005];

int bfs(int s, int t, vector <int> &parent)
{
    fill(parent.begin(), parent.end(), -1);
    deque <pair<int, int>> q;
    q.push_back({s, 1e9});
    parent[s] = -2;
    while(!q.empty())
    {
        int nod = q.front().first, flow = q.front().second;
        q.pop_front();
        for(int i = 0; i < v[nod].size(); i ++)
        {
            int next = v[nod][i];
            int capacity = cap[nod][next];
            if(capacity && parent[next] == -1)
            {
                parent[next] = nod;
                int min_flow = min(flow, capacity);
                if(next == t)
                    return min_flow;
                q.push_back({next, min_flow});
            }
        }
    }
    return 0;
}
int flow(int s, int t)
{
    int max_flow = 0, new_flow = 0;
    vector <int> parent(2 * n + 5);
    while(new_flow = bfs(s, t, parent))
    {
        max_flow += new_flow;
        int nod = t;
        while(nod != s)
        {
            int prev = parent[nod];
            cap[prev][nod] -= new_flow;
            cap[nod][prev] += new_flow;
            nod = parent[nod];
        }
    }
    return max_flow;
}
int main()
{
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    int e;
    f >> n >> m >> e;
    for(int i = 1; i <= e; i ++)
    {
        int x, y;
        f >> x >> y;
        v[x].push_back(n + y);
        v[n + y].push_back(x);
        cap[x][n + y] = 1;

    }
    for(int i = 1; i <= n; i ++)
        cap[0][i] = 1, cap[n + i][n + m + 1] = 1,
        v[0].push_back(i), v[i].push_back(0),
        v[i + n].push_back(n + m + 1), v[n + m + 1].push_back(n + i);
    g << flow(0, n + m + 1) << "\n";
    for(int i = 1; i <= n; i ++)
    {

        for(unordered_map<int, int> :: iterator j = cap[i].begin(); j != cap[i].end(); j ++)
        {
            int nod = j-> first, c = j->second;
            if(cap[nod][i] == 1 && nod != 0)
                g << i << " " << nod - n << "\n";
        }
    }
    return 0;
}