Cod sursa(job #387232)

Utilizator dead_knightTitei Paul Adrian dead_knight Data 27 ianuarie 2010 09:11:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
using namespace std;
#include<cstdio>
#include<fstream>
#define MAX 10001

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

nod *G[MAX];
int u[MAX], L[MAX], R[MAX], cuplaj, n, m;

void citire()
{
    int i,nrm,x,y;
    nod *p;
    ifstream fin("cuplaj.in");
    fin>>n>>m>>nrm;
    for(i=1;i<=n;i++)
        G[i]=NULL;
    for(i=1;i<=nrm;i++)
    {
        p=new nod;
        fin>>x>>y;
        p->info=y;
        p->next=G[x];
        G[x]=p;
    }
}

int pereche(int x)
{
    if(u[x])
        return 0;
    u[x]=1;
    for(nod *p=G[x];p;p=p->next)
    {
        int i=p->info;
        if(R[i]==0 || pereche(R[i]))
        {
            L[x]=i;
            R[i]=x;
            return 1;
        }
    }
    return 0;
}

void cupleaza()
{
    int gata=0,i;
    cuplaj=0;
    while(!gata)
    {
        gata=1;
        for(i=1;i<=n;i++)
            u[i]=0;
        for(i=1;i<=n;i++)
            if(L[i]==0)
                if(pereche(i))
                    cuplaj++,gata=0;
    }
}

void afis()
{
    int i;
    freopen("cuplaj.out","w",stdout);
    printf("%d\n",cuplaj);
    for(i=1;i<=n;  i++)
        if(L[i])
            printf("%d %d\n", i, L[i]);
}

int main()
{
    citire();
    cupleaza();
    afis();
}