Cod sursa(job #1216368)

Utilizator azkabancont-vechi azkaban Data 4 august 2014 13:05:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct celula{
                     int nod;
                     celula *next;
                     }*lista; 
                            
int i,j,n,m,e,x,y,sol,cuplare(1);
int viz[10005],lmatch[10005],rmatch[10005];
lista lda[10005];

void openIOFiles()
{
 freopen("cuplaj.in","r",stdin);
 freopen("cuplaj.out","w",stdout);
}

void add(int nod,lista &p) 
{
 lista r=new celula;
 r->nod=nod;
 r->next=p;
 p=r;    
}

int Hopcroft(int x) {
   lista p;
   if(viz[x]==1) return 0;
   viz[x]=1;
   for(p=lda[x];p;p=p->next)
           if(rmatch[p->nod]==0) {
                                 lmatch[x]=p->nod;
                                 rmatch[p->nod]=x; 
                                 return 1;
                                  }
   for(p=lda[x];p;p=p->next)
        if(Hopcroft(rmatch[p->nod])==1) {
                                       lmatch[x]=p->nod;
                                       rmatch[p->nod]=x;
                                       return 1; 
                                      }                   
   return 0;                     
}

int main()
{
 openIOFiles();
 scanf("%d%d%d",&n,&m,&e);
 while(e--){
           scanf("%d%d",&x,&y);         
           add(y,lda[x]);
           }
 while(cuplare){
               cuplare=0;
               memset(viz,0,sizeof viz);
               for(i=1;i<=n;i++)
                     if(!lmatch[i]) cuplare+=Hopcroft(i);  
               }
 for(i=1;i<=n;i++) 
      if(lmatch[i]) ++sol;
 printf("%d\n",sol);
   for(i=1;i<=n;i++) 
       if(lmatch[i]) printf("%d %d\n",i,lmatch[i]);
 return 0;   
}