Cod sursa(job #2675926)

Utilizator AndreiStanescuAlloys Nokito AndreiStanescu Data 22 noiembrie 2020 21:31:37
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include<bits/stdc++.h>
#define N 10005
using namespace std;

int n,m,e;
vector<int> G[N];
int viz1[N], viz2[N];
int seen[N];
int current;

void read()
{
    freopen("cuplaj.in","r",stdin);
    scanf("%d %d %d",&n,&m,&e);
    while(e--)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        G[x].push_back(y);
    }
}

bool augmentez(const int u)
{
    //cerr<<u<<' ';
    if(seen[u] == current)
        return false;
    seen[u] = current;
    for(auto& it: G[u])
        if(!viz2[it]){
            viz2[it] = u;
            viz1[u] = it;
            return true;
        }

    for(auto& it: G[u])
        if( augmentez(viz2[it]) ) {
            viz1[u] = it;
            viz2[it] = u;
            return true;
        }
    return false;
}

void cuplaj()
{
    int ans = 0;
    bool exista = 1;
    current = 1;
    while(exista) {
        exista = 0;
        //memset(seen,0,sizeof(seen));
        for (int i = 1; i <= n; ++i)
            if (!viz1[i])
                exista |= augmentez(i);
        ++ current;
    }
    freopen("cuplaj.out","w",stdout);
    for(int i=1;i<=n;++i)
        if(viz1[i])
            ++ans;
    printf("%d\n",ans);
    for(int i=1;i<=n;++i)
        if(viz1[i])
            printf("%d %d\n",i,viz1[i]);
}

int main()
{
    read();
    cuplaj();
    //augmentez(1);
    //augmentez(2);
    //augmentez(4);
}