Cod sursa(job #1860645)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 28 ianuarie 2017 11:37:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<cstdio>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define nmax (10*1001)
#define lmax (100*1001)
using namespace std;
struct list
{
    int n,p; //nodul si pozitia urmatoare
} l[lmax]; //lista grafului normal
char viz[nmax]; //vizite
int le[nmax]; //le[i]=cu ce nod din partea dreapta e legat nodul i din partea stanga
int ri[nmax]; //ri[i]=cu ce nod din partea stanga e legat nodul i din partea dreapta
int p[nmax]; //pozitia catre lista a nodurilor primului graf
int n,m; //numarul de noduri ale celor doua grafuri
int nr; //numarul maxim de cuplari

void add(int poz, int x, int y)
{
    l[poz].p=p[x]; l[poz].n=y; p[x]=poz;
}

void read()
{
    int i,k,u,v;
    scanf("%d %d %d\n",&n,&m,&k);
    for(i=1;i<=k;i++)
    {
        scanf("%d %d\n",&u,&v);
        add(i,u,v);
    }
}

int imperechere(int i)
{
    if(viz[i]) return 0;
    viz[i]=1;
    int j;
    for(j=p[i];j;j=l[j].p)
        if(!ri[l[j].n] || imperechere(ri[l[j].n]))
        {
            le[i]=l[j].n;
            ri[l[j].n]=i;
            return 1;
        }
    return 0;
}

void cuplaj()
{
    int i,ok=1;
    while(ok)
    {
        ok=0;
        for(i=1;i<=n;i++) viz[i]=0;
        for(i=1;i<=n;i++)
            if(!le[i] && imperechere(i))
                ok=1,nr++;
    }
}

void write()
{
    int i;
    printf("%d\n",nr);
    for(i=1;i<=n;i++)
        if(le[i])
            printf("%d %d\n",i,le[i]);
}

int main()
{
    freopen(infile,"r",stdin);
    freopen(outfile,"w",stdout);

    read();
    cuplaj();
    write();

    fclose(stdin);
    fclose(stdout);
    return 0;
}