Cod sursa(job #2641052)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 9 august 2020 18:32:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <bits/stdc++.h>
using namespace std;
const int NMAX= 10005;
int lt[NMAX] , rt[NMAX] , viz[NMAX];
vector< int > v[NMAX];
int n , m , nmax;
bool fix(int nod)
{
    if(viz[nod] == true )return false;
    viz[nod] = true;
    for(auto point : v[nod])
        if(rt[point] == 0)
        {
            lt[nod] = point;
            rt[point] = nod;
            return true;
        }
    for(auto point : v[nod])
     if(fix(rt[point]))
     {
         lt[nod] =  point ;
         rt[point] = nod;
         return true;
    }
    return false;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    int n , m , e;
    scanf("%d%d%d",&n,&m,&e);
    int a , b  , i ,j;
    for(i = 1 ; i <= e ; i++)
    {
        scanf("%d%d",&a,&b);
        v[a].push_back(b );
    }
    int ok = 1;
    while(ok)
    {
        ok=0;
        memset(viz,0,sizeof(viz));
    for (i = 1 ; i <= n ; ++ i)
     if(!lt[i]){fix( i );if(lt[i])ok=1;}
    }
    int cnt = 0 ;
    for(i = 1; i <= n; ++ i)
        cnt += (lt[i] > 0);
    cout<<cnt<<endl;
    for( i = 1 ; i<=n ;++i)
    {
        if(lt[i])printf("%d %d\n",i,lt[i]);
    }
}