Cod sursa(job #415282)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 11 martie 2010 01:40:28
Problema Cuplaj maxim in graf bipartit Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <string>
#include <vector>
#include <cstdio>
#define N 20001
using namespace std;
int viz[N];
vector<int> v[N];
int pereche[N];
int n1,n2,m;

int df(int k)
{int i,vec,pk;
 viz[k]=1;
 for (i=0;i<v[k].size();i++)
 {vec=v[k][i];
  if(viz[vec]==0)
  {if(pereche[vec]!=0)
   {viz[vec]=1;
    if(df(pereche[vec]))
    {pereche[vec]=k;
     pereche[k]=vec;
     return 1;
    }
   }
   else
   {pereche[k]=vec;
    pereche[vec]=k;
    return 1;
   }
  }
 }
 return 0;
}

int main ()
{freopen("cuplaj.in","r",stdin);
 freopen("cuplaj.out","w",stdout);
 scanf("%d %d %d",&n1,&n2,&m);

 int i,j,x,y,n=n1+n2;
 for (i=1;i<=m;i++)
 {scanf("%d %d",&x,&y);
  y+=n1;
  v[x].push_back(y);
  v[y].push_back(x);
 }
 
 for (i=1;i<=n;i++)
 {memset(viz,0,sizeof(viz));
  if(!pereche[i])
  {df(i);
  }
 }
 int nr;
 for (i=1,nr=0;i<=n1;i++)
 {if(pereche[i]!=0)
  {nr++;
  }
 }
 printf("%d\n",nr);
 for (i=1;i<=n1;i++)
 {if(pereche[i]!=0)
  printf("%d %d\n",i,pereche[i]-n1);
 }
 return 0;
}