Cod sursa(job #2419001)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 7 mai 2019 12:45:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#define dim 100001
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
bitset <dim> fr;
vector <int> V[dim];
int L[dim],R[dim],sol,n,m,k,i,x,y;
bool cupleaza(int nod){
    if(fr[nod]==1)
        return 0;
    fr[nod]=1;
    int vecin;
    for(int i=0;i<V[nod].size();i++){
     vecin=V[nod][i];
     if(R[vecin]==0){
        R[vecin]=nod;
        L[nod]=vecin;
        sol++;
        return 1;
     }
    }
    for(int i=0;i<V[nod].size();i++){
      vecin=V[nod][i];
      if(cupleaza(R[vecin])){
        L[nod]=vecin;
        R[vecin]=nod;
        return 1;
      }
    }
    return 0;
}
int main()
{
    fin>>n>>m>>k;
    for(i=1; i<=k; i++)
    {
        fin>>x>>y;
        V[x].push_back(y);
    }
    bool ok;
    do
    {
        ok=0;
        fr.reset();
        for(i=1; i<=n; i++)
            if(L[i]==0)
            {
                ok|=cupleaza(i);
            }
    }
    while(ok==1);
    fout<<sol<<"\n";
    for(i=1;i<=n;i++){
        if(L[i]!=0)
        fout<<i<<" "<<L[i]<<"\n";
    }
}