Cod sursa(job #1317332)

Utilizator robertstrecheStreche Robert robertstreche Data 14 ianuarie 2015 20:18:42
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <fstream>
#include <vector>
#include <cstring>
#include <bitset>

#define pb push_back
#define lmax 10005

using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

bool ok=true;
int n1,n2,m,x,y,nr;
int st[lmax],dr[lmax],ap[lmax];

vector <int>v[lmax];

inline bool update(int nod)
{
  if (ap[nod])
   return 0;

  ap[nod]=1;

  for (vector <int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
   if (dr[*it]==0)
    {
       st[nod]=*it;
       dr[*it]=nod;
       return 1;
    }
  for (vector <int>::iterator it=v[nod].begin();it!=v[nod].end();it++)
    if (update(dr[*it]))
     {
         st[nod]=*it;
         dr[*it]=nod;
         return 1;
     }
   return 0;
}
int main()
{
    f>>n1>>n2>>m;

    for (int i=1;i<=m;i++)
     {
         f>>x>>y;
         v[x].pb(y);
     }
    while (ok)
     {
         ok=false;
         memset(ap,0,sizeof(ap));
         for (int i=1;i<=n1;i++)
          if (!st[i] && ap[i]==0)ok+=update(i);
     }
    for (int i=1;i<=n1;i++)
      if (st[i])nr++;

    g<<nr<<'\n';

    for (int i=1;i<=n1;i++)
     if (st[i])g<<i<<" "<<st[i]<<'\n';

    f.close();
    g.close();
}