Cod sursa(job #1625225)

Utilizator vladttturcuman vlad vladtt Data 2 martie 2016 17:38:48
Problema Cuplaj maxim in graf bipartit Scor 12
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include <fstream>
#include <cstring>
#include <vector>
#define Nmax 10100
using namespace std;

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

vector<int> A[Nmax];
vector<int> B[Nmax];
int MachingA[Nmax];
int MachingB[Nmax];
int i,a,nA,b,nB,m,Max;

bool viz[Nmax];

bool DFS(int i)
{
    for(int j=0; j<A[i].size(); j++)
    {
        if(!viz[A[i][j]])
        {
            if(MachingB[A[i][j]])
            {
                viz[A[i][j]]=1;
                if(DFS(MachingB[A[i][j]]))
                {
                    MachingA[i]=A[i][j];
                    MachingB[A[i][j]]=i;
                    return 1;
                }
            }
            else
            {
                MachingA[i]=A[i][j];
                MachingB[A[i][j]]=i;
                return 1;
            }
        }
    }
    return 0;
}

bool DFS2(int i)
{
    for(int j=0; j<B[i].size(); j++)
    {
        if(!viz[B[i][j]])
        {
            if(MachingA[B[i][j]])
            {
                viz[B[i][j]]=1;
                if(DFS2(MachingA[B[i][j]]))
                {
                    MachingB[i]=B[i][j];
                    MachingA[B[i][j]]=i;
                    return 1;
                }
            }
            else
            {
                MachingB[i]=B[i][j];
                MachingA[B[i][j]]=i;
                return 1;
            }
        }
    }
    return 0;
}

bool Exist()
{
    Max++;
    memset(viz,0,sizeof(viz));
    for(i=1; i<=nA; i++)
        if(!MachingA[i] && !viz[i])
        {
            if(DFS(i))
                return 1;
        }

    memset(viz,0,sizeof(viz));
    for(i=1; i<=nB; i++)
        if(!MachingB[i] && !viz[i])
        {
            if(DFS2(i))
                return 1;
        }
    Max--;
    return 0;
}

void Gready()
{
    for(i=1;i<=nA;i++)
    {
        for(int j=0;j<A[i].size();j++)
        {
            if(!MachingB[A[i][j]])
            {
                MachingB[A[i][j]]=i;
                MachingA[i]=A[i][j];
                Max++;
            }
        }
    }
}

void solve()
{
    Gready();
    while(Exist());
}

int main()
{
    fin>>nA>>nB>>m;
    for(i=1; i<=m; i++)
    {
        fin>>a>>b;
        A[a].push_back(b);
        B[b].push_back(a);
    }

    solve();

    fout<<Max<<'\n';

    for(i=1; i<=nB; i++)
        if(MachingB[i])
            fout<<MachingB[i]<<' '<<i<<'\n';

    return 0;
}