Cod sursa(job #2938511)

Utilizator proflaurianPanaete Adrian proflaurian Data 12 noiembrie 2022 10:30:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int N=20010;
int n,m,e,nr,cup[N];
vector<int> v[N];
bitset<N> viz;
vector<pair<int,int>> sol;
bool cupleaza(int);
int main()
{
    f>>n>>m>>e;
    for(; e; e--)
    {
        int x,y;
        f>>x>>y;
        y+=n;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    bool cuplaj=true;
    while(cuplaj)
    {
        viz.reset();
        cuplaj=false;
        for(int i=1; i<=n; i++)
            if(!cup[i]&&!viz[i])
                if(cupleaza(i))
                    cuplaj=true;
    }
    for(int i=1;i<=n;i++)
        if(cup[i])
            sol.push_back(make_pair(i,cup[i]-n));
    g<<sol.size()<<'\n';
    for(auto it:sol)
        g<<it.first<<' '<<it.second<<'\n';
    return 0;
}
bool cupleaza(int nod)
{
    if(viz[nod])
        return false;
    viz[nod]=1;
    for(auto vec:v[nod])
        if(!cup[vec])
        {
            cup[nod]=vec;
            cup[vec]=nod;
            return true;
        }
    for(auto vec:v[nod])
        if(cupleaza(cup[vec]))
        {
            cup[nod]=vec;
            cup[vec]=nod;
            return true;
        }
    return false;
}