Cod sursa(job #430415)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 30 martie 2010 23:44:42
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<iostream>
#include<vector>
#include<string>

using namespace std;

#define NM 10005

vector<int> G[NM];

int cuplu[NM][2],cuplaj=0,L,R,E;

inline void leaga(int a,int b)
{
    cuplu[a][0]=b;
    cuplu[b][1]=a;   
}

int cupleaza(int nod)
{
    for(int i=0;i<G[nod].size();++i)
    {
        int nnod=G[nod][i];
        
        if(!cuplu[nnod][1]) 
        {
            leaga(nod,nnod);
            return 1;
        }   
    }
    
    for(int i=0;i<G[nod].size();++i)
    {
        int nnod=G[nod][i];
        if(cuplu[nnod][1]==nod) continue;
        
        if(cupleaza(cuplu[nnod][1]))
        {
             leaga(nod,nnod);
             return 1;                       
        }    
    }
    
    return 0;
}

int main()
{
    int a,b;
    
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    
    scanf("%d %d %d",&L,&R,&E);
    
    while(E--)
    {
        scanf("%d %d",&a,&b);      
        G[a].push_back(b);
    }
    
    while(1)
    {
        int plus=0;    
            
        for(int i=1;i<=L;++i)  
           if(!cuplu[i][0])  
           if(cupleaza(i)) 
           {
               ++cuplaj;
               plus=1;          
           }
        
        if(!plus) break;  
    }
    
    printf("%d\n",cuplaj);
    
    for(int i=1;i<=L;++i)
       if(cuplu[i][0]) printf("%d %d\n",i,cuplu[i][0]);
    
    return 0;
}