Cod sursa(job #1926810)

Utilizator edicCiuculescu Eduard edic Data 14 martie 2017 18:16:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<cstdio>
#include<cstring>
using namespace std;
const int valmax=100000;
const int nmax=10001;
struct lis{int val,next;};
struct cuplu{int st,dr;};
cuplu cuplaj[nmax];
int indexn[nmax];
int indexm[nmax];
lis has[2*valmax+1];
int viz[valmax+1];
int sum=0;
bool cuplare(int nod)
{
    if(viz[nod]==1)
    {
        return 0;
    }
    viz[nod]=1;
    int i=indexn[nod];
    while(i)
    {
        if(cuplaj[has[i].val].dr==0)
        {
            cuplaj[nod].st=has[i].val;
            cuplaj[has[i].val].dr=nod;
            return 1;
        }
        i=has[i].next;
    }
    i=indexn[nod];
    while(i)
    {
        if(cuplare(cuplaj[has[i].val].dr)==1)
        {
            cuplaj[nod].st=has[i].val;
            cuplaj[has[i].val].dr=nod;
            return 1;
        }
        i=has[i].next;
    }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    int n,m,e,i,c=0,x,y;
    scanf("%d %d %d",&n,&m,&e);
    for(i=1;i<=e;i++)
    {
        scanf("%d %d",&x,&y);
        c++;
        has[c].next=indexn[x];
        indexn[x]=c;
        has[c].val=y;
        c++;
        has[c].next=indexm[y];
        indexm[y]=c;
        has[c].val=x;
    }
    int bun=1;
    while(bun)
    {
        bun=0;
        memset(viz,0,sizeof viz);
        for(i=1;i<=n;i++)
        {
            if(cuplaj[i].st==0)
            {
                if(cuplare(i)==1)
                {
                    bun=1;
                    sum++;
                }
            }
        }
    }
    printf("%d\n",sum);
    for(i=1;i<=n;i++)
    {
        if(cuplaj[i].st!=0)
        {
            printf("%d %d\n",i,cuplaj[i].st);
        }
    }
    return 0;
}