Cod sursa(job #3163680)

Utilizator alexandru.morusAlexandru Morus alexandru.morus Data 31 octombrie 2023 21:02:49
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.92 kb
///Alexandru Morus
#include <bits/stdc++.h>

using namespace std;
ifstream in("cuplaj.in");
ofstream out ("cuplaj.out");
vector<int> g[2000];
int flux[1001][1001],tata[2001],n,m;
int dennnis[10008],daddy[10008];
bool bfs()
{
    int vf[2000] = {0};
    queue<pair<int,int>> Q;
    vf[0] = 1;
    tata[0] = 0;
    Q.push({0,9999999});
    while(!Q.empty())
    {
        int nod = Q.front().first;
        int val = Q.front().second;
        Q.pop();
        for(auto i : g[nod])
        {
            if(!vf[i] && flux[nod][i])
            {
                tata[i] = nod;
                vf[i] = 1;
                Q.push({i,min(val,flux[nod][i])});
                if(i == n + m + 1)
                {
                    return 1;
                }
            }
        }
    }
    return 0;
}
int main()
{

    int i,a,b,c,af = 0,j;
    in >> n >> m >> c;
    for(i = 1; i <= c; i ++)
    {
        in >> a >> b;
        g[a].push_back(n + b);
        g[n + b].push_back(a);
        flux[a][n + b] = 1;
        dennnis[i] = a;
        daddy[i] = b;
    }
    for(i = 1; i <= n; i ++)
    {
        flux[0][i] = 1;
        g[0].push_back(i);
        g[i].push_back(0);
    }
    for(i = 1; i <= m; i ++)
    {
        g[i + n].push_back(n + m + 1);
        g[n + m + 1].push_back(i + n);
        flux[i + n][n + m + 1] = 1;
    }
    while(bfs())
    {
        int minim = 999999999;
        for(i = n + m + 1; i != 0; i = tata[i])
        {
            minim = min(minim,flux[tata[i]][i]);
        }
        for(i = n + m + 1; i != 0; i = tata[i])
        {
            flux[i][tata[i]] += minim;
            flux[tata[i]][i] -= minim;
        }
        af += minim;
    }
    out << af << '\n';
    for(i = 1; i <= c; i ++)
    {
        if(flux[dennnis[i]][n + daddy[i]] == 0)
        {
            out << dennnis[i] << ' ' << daddy[i] << '\n';
        }
    }
    return 0;
}