Cod sursa(job #273716)

Utilizator zbarniZajzon Barna zbarni Data 8 martie 2009 22:18:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream.h>
#include<string.h>
#define nx 10005
struct graf
 {
  int nod;graf *next;
 };
graf *g[nx];
int v[nx],vizN[nx],vizM[nx],n,m,e;
int cuplaj(int x)
 {
  v[x]=1;
  graf *q=new graf;
  for (q=g[x];q;q=q->next)
   if (!vizM[q->nod])
    {
     vizM[q->nod]=x;
     vizN[x]=q->nod;
     return 1;
    }
  q=new graf;
  for (q=g[x];q;q=q->next)
   if (!v[vizM[q->nod]])
     if (cuplaj(vizM[q->nod]))
       {
	vizM[q->nod]=x;
	vizN[x]=q->nod;
	return 1;
       }
  return 0;
 }

int main()
 {
  ifstream be ("cuplaj.in");
  ofstream ki ("cuplaj.out");
  be>>n>>m>>e;
  int i,x,y,ok=1,sz=0;
  for (i=1;i<=e;i++)
   {
    be>>x>>y;
    graf *q=new graf;
    q->nod=y;
    q->next=g[x];
    g[x]=q;
   }
  be.close();
  ok=1;
  while (ok)
   {
    ok=0;
    memset(v,0,sizeof(v));
    for (i=1;i<=n;++i)
     if (!vizN[i])
       if (cuplaj(i))
	{
	 ok=1;
	 sz++;
	}
   }
  ki<<sz<<'\n';
  for (i=1;i<=n;++i)
   if (vizN[i])
   ki<<i<<" "<<vizN[i]<<'\n';
  ki.close();
  return 0;
 }