Cod sursa(job #1161700)

Utilizator RadEmanuelRad Emanuel RadEmanuel Data 31 martie 2014 13:30:29
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
#include<list>
#include<vector>
#include<cstring>
#define DMAX 100
using namespace std;

ifstream fin ("cuplaj.in");
ofstream fout("cuplaj.out");
list<int> lista;
vector< list<int> >l(DMAX,lista);
int i,ok,n,m,nrm,x,y,cuplaj;
int viz[DMAX],st[DMAX],dr[DMAX];

int pairup(int x)
{
    list<int>::iterator it;
    if(viz[x])
        return 0;
    viz[x]=1;
    for(it=l[x].begin();it!=l[x].end();++it)
    {
        int y=*it;
        if (!dr[y] || pairup(dr[y]))
        {
            st[x]=y;
            dr[y]=x;
            return 1;
        }
    }
    return 0;
}

int main()
{
    fin>>n>>m>>nrm;
    for(;nrm--;)
    {
        fin>>x>>y;
        l[x].push_back(y);
    }
    ok=1;
    while(ok)
    {
        ok=0;
        for(i=1;i<=n;++i) viz[i]=0;
        for(i=1;i<=n;++i)
            if (!st[i] && pairup(i))
            {
                ++cuplaj;
                ok=1;
            }
    }
    fout<<cuplaj<<'\n';
    for(i=1;i<=n;++i)
        if(st[i]>0)
            fout<<i<<" "<<st[i]<<'\n';
    return 0;
}