Cod sursa(job #1563110)

Utilizator DrumeaVDrumea Vasile DrumeaV Data 5 ianuarie 2016 18:11:25
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

const int Mn = 10005;

int N,M,E,sol;
int A[Mn],B[Mn];
bool used[Mn],b;
vector< int > G[Mn];

bool match(int node)
{
    if (used[node])
       return 0;

    used[node] = 1;

    for (int i = 0;i < int(G[node].size());i++)
        if (!B[G[node][i]])
        {
            A[node] = G[node][i];
            B[G[node][i]] = node;
            return 1;
        }

    for (int i = 0;i < int(G[node].size());i++)
        if (match(B[G[node][i]]))
        {
            A[node] = G[node][i];
            B[G[node][i]] = node;
            return 1;
        }

    return 0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);

     int T;
     //scanf("%d",&T);

     //while (T--)
     //{
         scanf("%d %d %d",&N,&M,&E);
         sol = 0;
         memset(A,0,sizeof(A));
         memset(B,0,sizeof(B));

         while (E--)
         {
             int x,y;
             scanf("%d %d",&x,&y);
             G[x].push_back(y);
         }

         do
         {
             b = 0;
             memset(used,0,sizeof(used));

             for (int i = 1;i <= N;i++)
                 if (!A[i])
                    b |= match(i);

         }while (b);

         for (int i = 1;i <= N;sol += int(A[i] > 0),i++);

         printf("%d\n",sol);
     //}

  return 0;
}