Cod sursa(job #645241)

Utilizator balakraz94abcd efgh balakraz94 Data 8 decembrie 2011 21:30:19
Problema Cuplaj maxim in graf bipartit Scor 8
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include<cstdio>
#include<bitset>
#include<queue>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define n_max 10005
#define FOR(g) \
    for(pmuchie p = g; p ;p = p->urm)
using namespace std;

typedef struct muchie 
{ int nod, cap, flux; 
  muchie *urm, *last; 
} *pmuchie ;

pmuchie v[n_max], t[n_max];

bitset <n_max> uz; 

int n, m;

int sursa, dest, cuplaj;



void add(int x, int y)
{
	pmuchie p = new muchie, q = new muchie;
	
	p->nod = y, q->nod = x;
	p->last = q; q->last = p;
	
	p->urm = v[x], q->urm = v[y];
	v[x] = p; v[y] = q;
	
	p->cap = 1; p->flux = q->flux = q->cap = 0;
}



void citeste()
{
    freopen(infile,"r",stdin);
    
    int E, x, y;
    
    scanf("%d %d %d",&n, &m, &E);
    
    while(E--)
    {
	   scanf("%d %d",&x,&y);
        
       add(x,y+n);
    }
    
    sursa = 0;
    for(int i=1;i<=n;i++)
		add(sursa,i);
    
    
    dest = n+m+1;
    for(int i=n+1;i<=n+m;i++)
		add(i,dest);

    fclose(stdin);
}




int bfs()
{
    queue < int > q;
    
    uz.reset();
    
    q.push(sursa);
    uz[sursa] = 1;
	
	pmuchie p;
	
    while(!q.empty())
    {
        p = v[q.front()];
        q.pop();
        
       for( ; p; p=p->urm)
            if((p->cap - p->flux) > 0  && !uz[p->nod])
            {
                uz[p->nod] = 1;;
                q.push(p->nod);
                t[p->nod] = p; 
				
				if(p->nod == dest)
				{
					for( p = v[dest]; p; p = t[p->last->nod])
						p->flux++, p->last->flux--;
					return 1;
				}
            }
    }
	
	return 0;
}



void afiseaza()
{
    freopen(outfile,"w",stdout);
    
    printf("%d\n",cuplaj);
	
	for(int i=1;i<=n;i++)
		FOR(v[i])
			if(p->flux == 1)
				printf("%d %d\n",i,p->nod-n);
    
    fclose(stdout);
}


int main()
{
    citeste();
	
    while(bfs())
		cuplaj++;
	
    afiseaza();
    
    return 0;
}