Cod sursa(job #645462)

Utilizator rootsroots1 roots Data 9 decembrie 2011 19:12:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#include <cstring>

#define gSize 10001
#define useSize 10001
#define LSize 10001
#define RSize 10001

using namespace std;

ifstream in;
ofstream out;

struct graf
{
    int nod;
    graf *link;
}*g[gSize];

bool use[useSize];

int L[LSize];
int R[RSize];

inline void addedge(int x,int y)
{
    graf *p;
    p=new graf;
    p->nod=y;
    p->link=g[x];
    g[x]=p;
}

inline int match(int nod)
{
    if(use[nod]) return 0;
    use[nod]=true;

    for(graf *p=g[nod];p;p=p->link)
        if(!R[p->nod])
        {
            L[nod]=p->nod;
            R[p->nod]=nod;
            return 1;
        }

    for(graf *p=g[nod];p;p=p->link)
        if(match(R[p->nod]))
        {
            L[nod]=p->nod;
            R[p->nod]=nod;
            return 1;
        }

    return 0;
}

int main()
{
    int n,N,M,sol,x,y;

    in.open("cuplaj.in");

    in>>n>>N>>M;
    for(;M--;)
    {
        in>>x>>y;
        addedge(x,y);
    }

    in.close();

    memset(L,0,sizeof(L));
    memset(R,0,sizeof(R));

    sol=0;
    for(bool ok=true;ok;)
    {
        ok=false;
        memset(use,false,sizeof(use));
        for(int i=1;i<=n;++i)
            if(!L[i])
                if(match(i)) ++sol,ok=true;
    }

    out.open("cuplaj.out");

    out<<sol<<'\n';

    if(n<N)
    {
        for(int i=1;i<=n;++i)
            if(L[i]) out<<i<<' '<<L[i]<<'\n';
    }
    else
        for(int i=1;i<=N;++i)
            if(R[i]) out<<R[i]<<' '<<i<<'\n';

    out.close();

    return 0;
}