Cod sursa(job #2891639)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 19 aprilie 2022 12:53:43
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 kb
#include <bits/stdc++.h>

#define MAX_N 2000
#define MULT (1 << 30)

using namespace std;

struct FLOW {
    int s, t;
    int flux[MAX_N][MAX_N], parent[MAX_N], viz[MAX_N], cap[MAX_N][MAX_N];;
    vector <int> edges[MAX_N];

    void add_edge( int u, int v, int c ) {
        edges[u].push_back( v );
        edges[v].push_back( u );
        cap[u][v] = c;
    }

    bool bfs() {
        int u;
        queue <int> q;

        for ( u = 0; u < MAX_N; u++ )
            parent[u] = -1;
        for ( u = 0; u < MAX_N; u++ )
            viz[u] = 0;

        viz[s] = 1;
        q.push( s );
        while ( !q.empty() ) {
            u = q.front();
            q.pop();

            for ( int v: edges[u] ) {
                if ( !viz[v] && parent[v] == -1 && flux[u][v] < cap[u][v] ) {
                    parent[v] = u;
                    if ( v == t )
                        return 1;
                    q.push( v );
                    viz[v] = 1;
                }
            }
        }

        return 0;
    }

    int maxFlow() {
        int maxFlow, newFlow, v;

        maxFlow = 0;
        while ( bfs() ) {
            for ( int u: edges[t] ) {
                if ( viz[u] && flux[u][t] < cap[u][t] ) {
                    parent[t] = u;
                    newFlow = MULT;
                    v = t;
                    while ( v != s ) {
                        newFlow = min( newFlow, cap[parent[v]][v] - flux[parent[v]][v] );
                        v = parent[v];
                    }

                    maxFlow += newFlow;
                    v = t;
                    while ( v != s ) {
                        flux[parent[v]][v] += newFlow;
                        flux[v][parent[v]] -= newFlow;
                        v = parent[v];
                    }
                }
            }
        }

        return maxFlow;
    }
};

FLOW flow;

int main() {
    ifstream cin( "cuplaj.in" );
    ofstream cout( "cuplaj.out" );

    int n, m, k, u, v, i;

    cin >> n >> m >> k;
    for ( i = 0; i < k; i++ ) {
        cin >> u >> v;
        v += n;
        flow.add_edge( u, v, 1 );
    }
    flow.s = 0;
    flow.t = n + m + 1;
    for ( u = 1; u <= n; u++ )
        flow.add_edge( flow.s, u, 1 );
    for ( v = n + 1; v <= n + m; v++ )
        flow.add_edge( v, flow.t, 1 );

    cout << flow.maxFlow();

    return 0;
}