Cod sursa(job #2570676)

Utilizator victorv88Veltan Victor victorv88 Data 4 martie 2020 18:26:40
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX=10005;

vector<int>graph[NMAX];
int n, m, nmuchii, a, b, ok=true;
int vecindreapta[NMAX], vecinstanga[NMAX];
bitset<NMAX>viz;
vector<pair<int,int>>rez;

bool solve(int ind)
{
    if (viz[ind])
        return false;
    viz[ind]=1;
    for (auto &v:graph[ind])
    {
        if (!vecinstanga[v])
        {
            vecindreapta[ind]=v;
            vecinstanga[v]=ind;
            return true;
        }
    }
    for (auto &v:graph[ind])
    {
        if (solve(vecinstanga[v]))
        {
            vecindreapta[ind]=v;
            vecinstanga[v]=ind;
            return true;
        }
    }
    return false;
}

int main()
{
    f >> n >> m >> nmuchii;
    for (int i=1; i<=nmuchii; ++i)
    {
        f >> a >> b;
        graph[a].push_back(b);
    }
    while(ok)
    {
        ok=false;
        viz.reset();
        for (int i=1; i<=n; ++i)
        {
            if(!vecindreapta[i])
                ok|=solve(i);
        }
    }
    for (int i=1; i<=n; ++i)
    {
        if (vecindreapta[i])
        {
            rez.push_back({i,vecindreapta[i]});
        }
    }
    g << rez.size() << '\n';
    for (auto &v:rez)
    {
        g << v.first <<' '<<v.second << '\n';
    }
    return 0;
}