Cod sursa(job #3154234)

Utilizator matei0000Neacsu Matei matei0000 Data 3 octombrie 2023 20:33:47
Problema Cuplaj maxim in graf bipartit Scor 12
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <bits/stdc++.h>

using namespace std;


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





struct Flux
{
    struct Edge
    {
        int from, to, cap, ult;
    };
    vector <Edge> edges;
    vector <int> last, dist;
    queue <int> coada;
    int n;

    Flux(int cn)
    {
        n = cn;
        last.assign(n + 1, -1);
    }


    void baga(int from, int to, int cap)
    {
        edges.push_back({from, to, cap, last[from]});
        last[from] = edges.size() - 1;

        edges.push_back({to, from, 0, last[to]});
        last[to] = edges.size() - 1;
    }

    bool bfs(int sursa, int destinatie)
    {
        dist.assign(n + 1, 1e9);
        dist[sursa] = 0;
        coada.push(sursa);

        while(!coada.empty())
        {
            int x = coada.front();
            coada.pop();
            for(int y = last[x]; y != -1; y = edges[y].ult)
            {
                if(edges[y].cap > 0 && dist[edges[y].to] == 1e9)
                {
                    dist[edges[y].to] = dist[x] + 1;
                    coada.push(edges[y].to);
                }
            }
        }

        return (dist[destinatie] != 1e9);
    }



    int dfs(int sursa, int destinatie, int maxflux)
    {
        if(sursa == destinatie)
            return maxflux;
        int ans = 0;
        for(int y = last[sursa]; y != -1; y = edges[y].ult)
        {
            if(edges[y].cap > 0 && dist[edges[y].to] == (dist[sursa] + 1))
            {
                int trimis = dfs(edges[y].to, destinatie, min(maxflux, edges[y].cap));

                edges[y].cap -= trimis;
                edges[y ^ 1].cap += trimis;

                maxflux -= trimis;
                ans += trimis;
            }
        }
        return ans;
    }


    int MaxFlow(int sursa, int destinatie)
    {
        int ans = 0;
        while(bfs(sursa, destinatie))
            ans += dfs(sursa, destinatie, 1e9);
        return ans;
    }
};


int main()
{
    int n, m, e;
    in >> n >> m >> e;
    Flux x(m + n + 3);
    for(int i = 0; i < e; i++)
    {
        int l, r;
        in >> l >> r;
        r += n;
        x.baga(l, r, 1);
    }
    for(int i = 1; i <= n; i++)
        x.baga(m + n + 1, i, 1);
    for(int i = n; i <= n + m; i++)
        x.baga(i, m + n + 2,  1);
    out << x.MaxFlow(m + n + 1, m + n + 2);
}