Cod sursa(job #360084)

Utilizator socheoSorodoc Ionut socheo Data 29 octombrie 2009 16:27:30
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
vector<int>l[20001];
int n1,n2,m,i,j;
int dr[20001],st[20001],viz[20001];
int par(int nod)
{ if(viz[nod]==1)
	return 0;
  viz[nod]=1;
  for(vector<int>::iterator it=l[nod].begin();it!=l[nod].end();++it)
      if(dr[*it]==0)
	    { dr[*it]=nod;
	      st[nod]=*it;
		  return 1;
		}
 for(vector<int>::iterator it=l[nod].begin();it!=l[nod].end();++it)	
     if(par(dr[*it])==1)
	   {dr[*it]=nod;
	    st[nod]=*it;
		 return 1;
	   }

 return 0;
}
int main()
{ freopen("cuplaj.in","r",stdin);
  freopen("cuplaj.out","w",stdout);
  scanf("%d%d%d",&n1,&n2,&m);
  int x,y;
	for(i=1;i<=m;i++)
	 {	scanf("%d%d",&x,&y);
	    l[x].push_back(y);
		 }
int ok=1;
 while(ok==1)
 { ok=0;
   memset(viz,0,sizeof(viz));
    for(i=1;i<=n1;i++)
	  if(st[i]==0)
		  ok|=par(i);
	  
 }
 int cnt=0;
for(i=1;i<=n1;i++)
  if(st[i]>0)
	++cnt;
	
printf("%d\n",cnt);
for(i=1;i<=n1;i++)
	if(st[i]>0)
	  printf("%d %d\n",i,st[i]);
	
 	 
	return 0;
}