Cod sursa(job #1408130)

Utilizator gramatovici_paulGramatovici Paul gramatovici_paul Data 29 martie 2015 20:10:02
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 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 || pairUp(pereche[x],culoare)==true)
        {
            pereche[x]=nod;
            pereche[nod]=x;
            return true;
        }
    }
    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);
    }
    bool flag=true;
    int c=0;
    while(flag)
    {
        ++c;
        flag=false;
        for(i=1;i<=n1;++i)
        {
            if(pereche[i]==0)
            {
                if(pairUp(i,c))
                {
                    ++rez;
                    flag=true;
                }
            }
        }
    }
    out<<rez<<"\n";
    for(i=1;i<=n1;++i)
    {
        if(pereche[i]!=0)
        {
            out<<i<<" "<<pereche[i]-n1<<"\n";
        }
    }
    return 0;
}