Cod sursa(job #1399609)

Utilizator andreimdvMoldovan Andrei andreimdv Data 24 martie 2015 20:31:53
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include<vector>
using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

int n,m,i,a,b,sol,ok,j,l[10010],r[10010],vizitat[10010];

vector<int> v[10010];

int cuplaj(int x)
{
    if(vizitat[x]) return 0;
    vizitat[x]=1;
    for(int i=0;i<v[x].size();++i)
    {
        int aux=v[x][i];
        if(r[aux]==0) //nu e cuplat nodul aux din dreapta
        {
            l[x]=aux;
            r[aux]=x;
            return 1;
        }
    }

    for(int i=0;i<v[x].size();++i)
    {
        int aux=v[x][i];
        if(cuplaj(r[aux])) // daca se poate recupla nodul din stanga cuplat deja cu nodul cu care incercam sa cuplam nodul actual
        {
            l[x]=aux;
            r[aux]=x;
            return 1;
        }
    }
    return 0;
}



int main()
{
    fin>>a>>b>>m;
    for(i=1;i<=m;++i)
    {
        fin>>a>>b;
        v[a].push_back(b);
        //v[b].push_back(a);
    }

    ok=1;
    while(ok)
    {
        ok=0;
        for(i=1;i<=max(a,b);++i)
        vizitat[i]=0;

        for(i=1;i<=a;++i)
        {


            if(l[i]==0)
            {
                if(cuplaj(i))
                ok=1;
            }
        }
    }
    for(i=1;i<=a;++i)
    {
        if(l[i])
            sol++;
    }
    fout<<sol<<'\n';
    for(i=1;i<=a;++i)
    {
        if(l[i])
            fout<<i<<" "<<l[i]<<'\n';
    }


    return 0;
}