Cod sursa(job #1014052)

Utilizator george_stelianChichirim George george_stelian Data 22 octombrie 2013 00:03:17
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
#include <cstdlib>
#include <vector>

using namespace std;

struct abc
{
    short int a;
    short int b;
    short int c;
};
vector<short int>v[10000];
short int sol[10000];
int i,j,n,m,x,y,p,nr;
char cup[10000],cup1[10000];
abc coada[10000];


int cuplaj(short int a)
{
    int i;
    nr=0;
    for(i=1;i<=max(n,m);i++)
    {
        cup[i]=0;
        cup1[i]=0;
    }
    cup[a]=1;
    for(i=0;i<v[a].size();i++)
    {
        x=v[a][i];
        if(cup1[x]==0)
        {
            cup1[x]=1;
            coada[++nr].a=x;
            coada[nr].b=a;
            coada[nr].c=0;
        }
        if(sol[x]==0) return 1;
    }
    for(i=1;i<=nr;i++)
    {
        a=sol[coada[i].a];
        if(cup[a]==0)
        {
            cup[a]=1;
            for(j=0;j<v[a].size();j++)
            {
                x=v[a][j];
                if(cup1[x]==0)
                {
                    cup1[x]=1;
                    coada[++nr].a=x;
                    coada[nr].b=a;
                    coada[nr].c=i;
                }
                if(sol[x]==0) return 1;
            }
        }
    }
    return 0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&p);
    for(i=1;i<=p;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
    }
    for(i=1;i<=n;i++)
    {
        if(cuplaj(i))
        {
            sol[coada[nr].a]=coada[nr].b;
            for(int j=coada[nr].c;j>0;j=coada[j].c)
            {
                sol[coada[j].a]=coada[j].b;
            }
        }
    }
    nr=0;
    for(i=1;i<=m;i++) if(sol[i])nr++;
    printf("%d\n",nr);
    for(i=1;i<=m;i++)
        if(sol[i]) printf("%d %d\n",sol[i],i);
    return 0;
}