Cod sursa(job #1894105)

Utilizator edi_laitinLaitin Eduard edi_laitin Data 26 februarie 2017 14:54:33
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");

vector <int> G[10005];
int L[10005],R[10005],N,M,E,nr;
bool Use[10005];

void Read()
{
    fin>>N>>M>>E;
   for(int i=1;i<=E;i++)
   {
     int x,y;
     fin>>x>>y;
     G[x].push_back(y);
   }
}

bool pairup(int nod)
{
    if(Use[nod]==1)
        return 0;
    Use[nod]=1;
   for(int i=0;i<G[nod].size();i++)
   {
      int Vecin=G[nod][i];
       if(R[Vecin]==0)
       {
           L[nod]=Vecin;
           R[Vecin]=nod;
           return 1;
       }
   }
   for(int i=0;i<G[nod].size();i++)
     {
       int Vecin=G[nod][i];
         if(pairup(R[Vecin])==1)
         {
             R[Vecin]=nod;
             L[nod]=Vecin;
             return  1;
         }
     }
    return 0;
}

void Solve()
{
    bool ok=1;
   while(ok==1)
    {
        ok=0;
        memset(Use,0,sizeof(Use));
       for(int i=1;i<=N;i++)
         if(L[i]==0)
           ok |=pairup(i);
    }
    for(int i=1;i<=N;i++)
      if(L[i]>0)
         nr++;
}

void Print()
{
   fout<<nr<<"\n";
    for(int i=1;i<=N;i++)
       if(L[i]>0)
          fout<<i<<" "<<L[i]<<"\n";
}

int main()
{
    Read();
    Solve();
    Print();
    return 0;
}