Cod sursa(job #1407994)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 29 martie 2015 19:49:41
Problema Cuplaj maxim in graf bipartit Scor 8
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int vizitat[22222],pereche[22222],rez;
vector<int> vecini[22222];

bool pairUp(int nod,int culoare)
{
    int i,x,j,y;
    vizitat[nod]=culoare;
    for(i=0;i<vecini[nod].size();++i)
    {
        x=vecini[nod][i];
        if(vizitat[x]==culoare)
            continue;
        vizitat[x]=culoare;
        if(pereche[x]==0)
        {
            pereche[x]=nod;
            pereche[nod]=x;
            return true;
        }
        if(pairUp(pereche[x],culoare)==true)
        {
            pereche[x]=nod;
            pereche[nod]=x;
            return true;
        }
        for(j=0;j<vecini[x].size();++j)
        {
            y=vecini[x][j];
            if(vizitat[y]==culoare)
                continue;
            if(pairUp(y,culoare)==true)
                ++rez;
        }
    }
    return false;
}


int main()
{
    int n1,n2,m,i,a,b;
    ifstream in("cuplaj.in");
    ofstream out("cuplaj.out");
    in>>n1>>n2>>m;
    for(i=1;i<=m;++i)
    {
        in>>a>>b;
        b+=n1;
        vecini[a].push_back(b);
        vecini[b].push_back(a);
    }
    for(i=1;i<=n1;++i)
    {
        if(pereche[i]==0)
        {
            if(pairUp(i,i))
                ++rez;
        }
    }
    out<<rez<<"\n";
    for(i=1;i<=n1;++i)
    {
        if(pereche[i]!=0)
        {
            out<<i<<" "<<pereche[i]-n1<<"\n";
        }
    }
    return 0;
}