Cod sursa(job #515743)

Utilizator gorgovanAurelian Namascu gorgovan Data 22 decembrie 2010 11:58:51
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
using namespace std;
#include<iostream>
#include<fstream>

struct nod
{
  int x;
  nod *n;
};

int S,D,M;
int l[10001],r[10001];
bool use[10001];

nod *a[10001];

ofstream fout("cuplaj.out");

inline bool pairup(const int n)
{
    if(use[n]) return 0;
    use[n]=1;

    for(nod*i=a[n];i;i=i->n)
            if(!l[i->x])
            {
                l[i->x]=n;
                r[n]=i->x;
                return 1;
            }
    for(nod*i=a[n];i;i=i->n)
            if(pairup(l[i->x]))
            {
                l[i->x]=n;
                r[n]=i->x;
                return 1;
            }


}

void solve()
{
    int ok=1;
    int i;
    int flow=0;


    while(ok)
    {
        ok=0;
        for(i=0;i<=S;i++) use[i]=0;

        for(i=1;i<=S;i++)
            if(!r[i])
                  if(pairup(i)) ok=1,++flow;

    }
    fout<<flow<<"\n";
    for(i=1;i<=S;i++)
       if(r[i]) fout<<i<<" "<<r[i]<<"\n";

}

void cit()
{int x,y,i;
    ifstream fin("cuplaj.in");

    fin>>S>>D>>M;

    for(i=1;i<=M;i++)
    {
        fin>>x>>y;
        nod *t=new nod;
        t->x=y;
        t->n=a[x];
        a[x]=t;


    }

    fin.close();
}

int main()
{

    cit();
    solve();
    fout.close();
    return 0;
}