Cod sursa(job #2675891)

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

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

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])
        return false;
    seen[u] = true;
    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;
    for(int i=1;i<=n;++i)
        if(!viz1[i])
        {
            if(!augmentez(i)) {
                memset(seen, 0, sizeof(seen));
                ans += augmentez(i);
            }
            else
                ++ ans;
        }
    freopen("cuplaj.out","w",stdout);
    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);
}