Cod sursa(job #1608796)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 22 februarie 2016 13:00:04
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<cstdio>
#include<vector>

using namespace std;

vector<int> con[10010];
int vecs[10010],vecd[10010],viz[10010];
int n,m,e;

int connect(int nd)
{
    if(viz[nd]==1)
    {
        return 0;
    }
    viz[nd]=1;
    for(vector<int>::iterator it=con[nd].begin();it!=con[nd].end();it++)
    {
        if(vecd[*it]==0)
        {
            vecd[*it]=nd;
            vecs[nd]=*it;
            return 1;
        }
    }
    for(vector<int>::iterator it=con[nd].begin();it!=con[nd].end();it++)
    {
        if(connect(vecd[*it])==1)
        {
            vecd[*it]=nd;
            vecs[nd]=*it;
            return 1;
        }
    }
    return 0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

    scanf("%d %d %d",&n,&m,&e);

    int x,y;

    for(int i=1;i<=e;i++)
    {
        scanf("%d %d",&x,&y);
        con[x].push_back(y);
    }

    bool flag=0;

    while(1)
    {
        flag=0;
        for(int i=1;i<=n;i++)
        {
            if(vecs[i]==0)
            {
                if(connect(i)==1)
                {
                    flag=1;
                }
            }
        }
        if(flag==0)
        {
            break;
        }
        for(int i=1;i<=n;i++)
        {
            viz[i]=0;
        }
    }
    int res=0;
    for(int i=1;i<=n;i++)
    {
        if(vecs[i]!=0)
        {
            res++;
        }
    }
    printf("%d\n",res);
    for(int i=1;i<=n;i++)
    {
        if(vecs[i]!=0)
        {
            printf("%d %d\n",i,vecs[i]);
        }
    }
}