Cod sursa(job #1400216)

Utilizator andreimdvMoldovan Andrei andreimdv Data 25 martie 2015 10:17:27
Problema Cuplaj maxim in graf bipartit Scor 100
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,muchii,i,sol,a,b;
int l[10010],r[10010];
vector<int> v[10010];
bool vizitat[10010],ok;


bool cuplaj(int x)
{
    if(vizitat[x]) return false;
    vizitat[x]=true;
    for(int i=0;i<(int)v[x].size();++i)
    {
        int y=v[x][i];
        if(r[y]==0)//nu e cuplat
        {
            r[y]=x;
            l[x]=y;
            return true;
        }
    }
    for(int i=0;i<(int)v[x].size();++i)
    {
        int y=v[x][i];
        if(cuplaj(r[y])) // nodul poate fi recuplat
        {
            r[y]=x;
            l[x]=y;
            return true;
        }
    }
    return false;
}



int main()
{
    fin>>n>>m>>muchii;
    for(i=1;i<=muchii;++i)
    {
        fin>>a>>b;
        v[a].push_back(b);
    }
    ok=true;
    while(ok) //cat timp s-a mai cuplat ceva mai incercam
    {
        ok=false;
        for(i=1;i<=n;++i)
            vizitat[i]=0;
        for(i=1;i<=n;++i)
        {
            if(l[i]==0)
            {
                if(cuplaj(i))
                {
                    ok=true;
                }
            }
        }
    }
    for(i=1;i<=n;++i)
    {
        if(l[i])
            sol++;
    }
    fout<<sol<<'\n';
    for(i=1;i<=n;++i)
    {
        if(l[i])
            fout<<i<<" "<<l[i]<<'\n';
    }

    return 0;
}