Cod sursa(job #902557)

Utilizator costi_.-.Costinnel costi_.-. Data 1 martie 2013 15:00:00
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.05 kb
#include<fstream>
#define nmax 10001
using namespace std;

struct nod_lista{
    int val;
    nod_lista *link;
};

nod_lista *G[nmax],*Last[nmax];
int viz[nmax],st[nmax],dr[nmax],cuplaj;
int L,R,E;
void adauga(int unde,int ce)
{
    nod_lista *q=new nod_lista;
    q->val=ce;
    q->link=NULL;

    if(!G[unde])
    G[unde]=Last[unde]=q;
    else
    {
        Last[unde]->link=q;
        Last[unde]=q;
    }
}

void citeste()
{
    ifstream f("cuplaj.in");
    int i,x,y;

    f>>L>>R>>E;
    for(i=1;i<=E;i++)
    {
        f>>x>>y;
        adauga(x,y);
    }

    f.close();
}

int cuplare(int nod)
{
    if(viz[nod])
    return 0;
    else
    viz[nod]=1;

    nod_lista *q=G[nod];
    while(q)
    {
        int vecin=q->val;
        if(!st[vecin])//daca vecinul din dreapta n-are pe nimeni in stanga
        {
            //putem sa-i cuplam
            st[vecin]=nod;
            dr[nod]=vecin;
            return 1;
        }
        q=q->link;
    }

    //daca nu am gasit nici un vecin liber
    q=G[nod];
    while(q)
    {
        int vecin=q->val;
        if(cuplare(st[vecin])) //dca pot realiza o cuplare pentru cel care-l ocupa si sa-l eliberez astfel
           {
               st[vecin]=nod;
               dr[nod]=vecin;
               return 1;
           }
           q=q->link;
    }

    //daca nu sa reusit nimic
    return 0;
}

void rezolva()
{
    cuplaj=1;
    int i;

    while(cuplaj) // cat timp a avut loc o cuplare
    {
        //poate se mai realizeaza una
        for(i=1;i<=L;i++)
        viz[i]=0;

        cuplaj=0;
        for(i=1;i<=L;i++)
        if(!dr[i])
        cuplaj+=cuplare(i);
    }

    cuplaj=0;
    for(i=1;i<=L;i++)
    if(dr[i])
    ++cuplaj;
}

void scrie()
{
    ofstream g("cuplaj.out");
    int i;

    g<<cuplaj<<'\n';
    for(i=1;i<=L;i++)
    if(dr[i])
    g<<i<<' '<<dr[i]<<'\n';

    g.close();
}

int main()
{
    citeste();
    rezolva();
    scrie();
    return 0;
}