Cod sursa(job #1430694)

Utilizator roxyroxy2011Luca Roxana roxyroxy2011 Data 8 mai 2015 19:00:35
Problema Cuplaj maxim in graf bipartit Scor 22
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <stdio.h>
#define NMAX 10004

using namespace std;

FILE *cin=fopen("cuplaj.in","r");
FILE *cout=fopen("cuplaj.out","w");

struct muchie{int nr;muchie*urm;};
typedef muchie*Lista;
Lista lis[2*NMAX];
int N,M,E,c[2*NMAX],drum[2*NMAX],nd,viz[2*NMAX],ok;

void read();
void solve();
void inserare(Lista&,int);
void modifica();
void write();
bool cauta_lant();
bool dfs(int);

int main()
{
    read();
    solve();
    write();
    fclose(cin);fclose(cout);
    return 0;
}

void read()
{
    int i,x,y;
    fscanf(cin,"%d %d",&N,&M);
    for (i=1;i<=N+M;i++)
        lis[i]=NULL;
    fscanf(cin,"%d",&E);
    for (i=1;i<=E;i++)
    {
        fscanf(cin,"%d %d",&x,&y);
        y+=N;
        inserare(lis[x],y);
        inserare(lis[y],x);
    }
}

void write()
{
    int i,k=0;
    for (i=1;i<=N;i++)
        if (c[i]) k++;
    fprintf(cout,"%d\n",k);
    for (i=1;i<=N;i++)
        if (c[i])
        fprintf(cout,"%d %d\n",i,c[i]-N);
}

void inserare(Lista& prim,int nr)
{
    Lista aux;
    aux=new muchie;
    aux->nr=nr;
    aux->urm=prim;
    prim=aux;
}

void solve()
{
    int i;
    while (cauta_lant())
        modifica();
}

void modifica()
{
    int i;
    for (i=1;i<=nd;i=i+2)
    {
        c[drum[i]]=drum[i+1];
        c[drum[i+1]]=drum[i];
    }
}

bool cauta_lant()
{
    int i;
    for (i=1;i<=N+M;++i) viz[i]=0;
    for (i=1;i<=N+M;++i)
    {
        nd=0;
        if (c[i]==0 && dfs(i))
            return true;
    }
    return false;
}

bool dfs(int vf)
{
    Lista aux=lis[vf];
    viz[vf]=1;drum[++nd]=vf;
    while (aux!=NULL)
    {
        if (!viz[aux->nr])
            if (c[aux->nr]==0)
            {
                drum[++nd]=aux->nr;
                return true;
            }
            else {
                drum[++nd]=aux->nr;
                viz[aux->nr]=1;
                if (dfs(c[aux->nr])) return true;
            }

        aux=aux->urm;
    }
    return false;
}