Cod sursa(job #2525711)

Utilizator Emil64Emil Centiu Emil64 Data 17 ianuarie 2020 18:14:02
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.16 kb
#include <bits/stdc++.h>



using namespace std;



vector<int> g[20005];



int c[20005][20005]= {0}, f[20005][20005]= {0};

int n, m;



int p[20005]= {0};

bool viz[20005];



bool bfs()
{

    queue<int> q;

    q.push(0);

    memset(viz, false, sizeof(viz));

    viz[0] = true;

    while(!q.empty())
    {



        int nod = q.front();

        q.pop();

        if(nod!=n)

            for(int i=0; i<g[nod].size(); i++)
            {

                int adi = g[nod][i];

                if(viz[adi] || f[nod][adi] == c[nod][adi])

                    continue;

                viz[adi] = true;

                q.push(adi);

                p[adi] = nod;

            }

    }

    if(viz[n])

        return true;

    return false;

}



int main()

{

    int i, a, b, cmax, e;

    ifstream _f("cuplaj.in");

    ofstream _g("cuplaj.out");



    _f >> n >> m >> e;

    for(i=1; i<=e; i++)
    {

        _f >> a >> b;

        b+=n;

        g[a].push_back(b);

        g[b].push_back(a);

        c[a][b] = 1;

    }

    for(i=1; i<=n; i++)
    {

        g[0].push_back(i);

        g[i].push_back(0);

        c[0][i] = 1;

    }

    n+=m;

    for(i=n-m+1; i<=n; i++)
    {

        g[n+1].push_back(i);

        g[i].push_back(n+1);

        c[i][n+1] = 1;

    }



    int flux, fmin;

    n++;

    for(flux=0; bfs();)
    {

        for(int j = 0; j< g[n].size(); j++)
        {

            fmin = 0x3f3f3f3f;

            p[n] = g[n][j];

            if(!viz[p[n]] || c[p[n]][n] == f[p[n]][n])

                continue;

            for(int nod = n; nod!=0; nod = p[nod])
            {

                fmin = min(fmin, c[p[nod]][nod] - f[p[nod]][nod]);

            }

            for(int nod = n; nod!=0; nod = p[nod])
            {

                f[p[nod]][nod] += fmin;

                f[nod][p[nod]] -= fmin;

            }

            flux += fmin;

        }

    }

    n--;

    _g << flux << "\n";

    for(int i=1; i<n-m+1; i++)
    {

        for(int j = 0; j<g[i].size(); j++)

            if(f[i][g[i][j]] !=0 && g[i][j] != 0)
            {

                _g << i << " " << g[i][j] - (n-m) << "\n";

                continue;

            }

    }



}