Cod sursa(job #2240924)

Utilizator parsulPaul Cristian Banu-Taran parsul Data 14 septembrie 2018 14:51:39
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<cstdio>
#include<cstring>
#include<vector>
#define oo 100005
using namespace std;
int u,v,N,M,E;
vector<int>g[oo];
void scan()
{
    freopen( "cuplaj.in", "r", stdin );
    freopen( "cuplaj.out", "w", stdout );
    scanf("%d %d %d",&N,&M,&E);
    for(int i=0;i<E;i++)
    {
        scanf("%d %d",&u,&v);
        g[u].push_back(v);
    }
}
bool used[oo];
int L[oo],R[oo];
bool iugo(int node)
{
    if(used[node])
        return false;
    used[node]=true;
    for(int i=0;i<g[node].size();i++)
    {
        int neigh=g[node][i];
        if(!R[neigh])
        {
            R[neigh]=node;
            L[node]=neigh;
            return true;
        }
    }
    for(int i=0;i<g[node].size();i++)
    {
        int neigh=g[node][i];
        if(iugo(R[neigh]))
        {
            R[neigh]=node;
            L[node]=neigh;
            return true;
        }
    }
    return false;
}
int pairing()
{
    bool ok=true;
    int nrcrt=0;
    while(ok)
    {
        memset(used,0,sizeof used);
        ok=false;
        for(int i=1;i<=N;i++)
            if(!L[i])
                if(iugo(i))
            {
                nrcrt++;
                ok=true;
            }

    }
    printf("%d\n",nrcrt);
}
void print()
{
    for(int i=1;i<=N;i++)
        if(L[i])
         printf( "%d %d\n", i, L[i] );

}
int main()
{
    scan();
    pairing();
    print();
}