Cod sursa(job #1226611)

Utilizator vasica38Vasile Catana vasica38 Data 6 septembrie 2014 14:37:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;

typedef struct lista
{
    int info;
    lista *next;
} * nod;

nod a[10001];
int i,j,k,m,n,u,l;
bool viz[10001];
int este[10001],h[10001],sol;

void add(int x, nod &p)
{
    nod r = new lista;
    r->info=x;
    r->next=p;
    p=r;
}


bool dfs(int x)
{
    if (viz[x]==1) return 0;
    viz[x]=1;
    nod r=a[x];
    while (r)
    {
        if (!este[r->info] || dfs(este[r->info]))
        {
            este[r->info]=x;
            h[x]=r->info;
            //++sol;
            return 1;
        }
    r=r->next;
    }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&k,&m);
    for (i=1; i<=m; ++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(y,a[x]);
    }
    bool ok = true;
    int sol=0;
    while (ok)
    {
        ok=false;
        memset(viz,0,sizeof(viz));
        for (i=1; i<=n; ++i)
            if (!h[i]) ok+=dfs(i);// sol++;

    }
    for (i=1; i<=k; ++i)
        if (este[i]) ++sol;
    printf("%d\n",sol);
    for (i=1; i<=k; ++i)
        if ( este[i] ) printf("%d %d\n",este[i],i);

return 0;
}