Cod sursa(job #1262087)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 12 noiembrie 2014 23:06:20
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

 vector <int> v[10005];

  int n1,n2,m,l[10005],r[20005],use[10005];

  int DFS(int x)
  { int i,nod;
      if (use[x]) return 0;
       use[x]=1;
      for(i=0;i<v[x].size();i++)
        { nod=v[x][i];
            if (!r[nod])
            { l[x]=nod;
              r[nod]=x;
              return 1;
            }
        }

     for(i=0;i<v[x].size();i++)
      { nod=v[x][i];
         if (DFS(r[nod]))
          { l[x]=nod;
            r[nod]=x;
          return 1;
          }

      }

   return 0;
  }

int main()
{ int i,x,y,sol=0,ok;
    f>>n1>>n2>>m;

    for(i=1;i<=m;i++)
    { f>>x>>y;
       v[x].push_back(n1+y);
    }
     ok=1;
    while(ok)
    {
      memset(use,0,sizeof(use));
        ok=0;
      for(i=1;i<=n1;i++)
       if (!l[i] && DFS(i)) {sol++; ok=1;}
    }

     g<<sol<<"\n";
    for(i=1;i<=n1;i++)
     if (l[i]) g<<i<<" "<<l[i]-n1<<"\n";

  return 0;
}