Cod sursa(job #1436167)

Utilizator Denisa13Stefan Denisa Denisa13 Data 15 mai 2015 12:43:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

vector<int> G[20010];
int l,r,m, pereche[20010], viz[20010];

bool imperechere(int nod, int culoare)
{
    viz[nod]=culoare;
    for(int i=0;i<G[nod].size();i++)//vecinii nodului
    {
        int vecin=G[nod][i];
        if(viz[vecin]!=culoare)//daca nu are pereche in culoarea asta
        {
            viz[vecin]=culoare;
            if(pereche[vecin]==0 || imperechere(pereche[vecin],culoare)==1)//daca nu are pereche sau daca i-am gasit alta pereche perechii; in cazul in care nu se mai gaseste alta pereche, singurul efect este colorarea perechii
            {
                pereche[nod]=vecin;
                pereche[vecin]=nod;
                return 1;
            }
        }
    }
    return false;
}

int main()
{
    int a,b,i,culoare=0,nr_perechi=0;
    f>>l>>r>>m;
    for(i=1;i<=m;i++)
    {
        f>>a>>b;
        b=b+l;
        G[a].push_back(b);
        G[b].push_back(a);
    }
    bool ok=1;
    while(ok==1)//cat timp se pot face perechi
    {
        culoare++;//se incearca diverse colorari(moduri de a imperechea) pana cand se atinge numarul maxim de perechi si ok ramane 0
        ok=0;
        for(i=1;i<=l;i++)
            if(pereche[i]==0)//daca nodul nu are pereche
                if(imperechere(i,culoare)==1)//daca nodul a fost imperecheat
                {
                    nr_perechi++;
                    ok=1;//s-a facut o pereche
                }
    }
    g<<nr_perechi<<'\n';
    for(i=1;i<=l;i++)
        if(pereche[i]!=0)
            g<<i<<' '<<pereche[i]-l<<'\n';
    return 0;
}