Cod sursa(job #2820598)

Utilizator butasebiButa Gabriel-Sebastian butasebi Data 20 decembrie 2021 21:46:38
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.74 kb
#include <bits/stdc++.h>
#define INF 100000000
#define N12 20005
using namespace std;
map<int, map<int, int>> flux;
map<int, map<int, int>> capacity;
int coada[N12], st, dr, D, dad[N12], N1, N2, m, i, x, y, z, flux_maximal;
bool seen[N12];
vector <int> v[N12];
int ct = 1;
bool BFS()
{
    st = 1;
    dr = 1;
    coada[1] = 0;
    memset(seen, false, sizeof(seen));
    seen[0] = true;
    while(st <= dr)
    {
        //cout << coada[st] << ": ";
        int aux = coada[st];
        st ++;
        if(aux == D)continue;
        for(int i = 0; i < v[aux].size(); i ++)
        {
            //cout << "In for\n";
            int aux1 = v[aux][i];
            if(seen[aux1] == true || flux[aux][aux1] == capacity[aux][aux1])continue;
            //cout << aux1 << " ";
            seen[aux1] = true;
            dad[aux1] = aux;
            coada[++ dr] = aux1;
        }
        //cout << "\n";
    }
    //cout << "\n";
    //cout << "Returneaza " << seen[D];
    ct ++;
    return seen[D];
}
struct edges
{
    int x, y;
}vec[100005];
int aux, minn;
int main()
{
    ifstream f("cuplaj.in");
    ofstream g("cuplaj.out");
    f >> N1 >> N2 >> m;
    D = 20003;  //destination node
    for(i = 1; i <= m; i ++)
    {
        f >> vec[i].x >> vec[i].y;
        vec[i].y = vec[i].y + 10000;
        capacity[vec[i].x][vec[i].y] = 1;
        v[vec[i].x].push_back(vec[i].y);
        v[vec[i].y].push_back(vec[i].x);
    }
    for(i = 1; i <= N1; i ++)
    {
        capacity[0][i] = 1;
        v[0].push_back(i);
        v[i].push_back(0);
    }
    for(i = 10001; i <= 10000 + N2; i ++)
    {
        capacity[i][D] = 1;
        v[D].push_back(i);
        v[i].push_back(D);
    }
    while(BFS())
    {
        //cout << "BFS Done\n";
        for(i = 0; i < v[D].size(); i ++)
        {
            int aux1 = v[D][i];
            if(flux[aux1][D] == capacity[aux1][D] || seen[aux1] == false)continue;
            minn = INF;
            dad[D] = aux1;
            aux = D;
            while(aux != 0)
            {
                minn = min(minn, capacity[dad[aux]][aux] - flux[dad[aux]][aux]);
                aux = dad[aux];
            }
            if(minn == 0)continue;
            aux = D;
            while(aux != 0)
            {
                //cout << aux << " ";
                flux[dad[aux]][aux] += minn;
                flux[aux][dad[aux]] -= minn;
                aux = dad[aux];
            }
            //cout << "0 " << minn << "\n";
            flux_maximal = flux_maximal + minn;
        }

    }
    g << flux_maximal << "\n";
    for(i = 1; i <= m; i ++)
        if(flux[vec[i].x][vec[i].y])
            g << vec[i].x << " " << vec[i].y - 10000 << "\n";
    return 0;
}