Cod sursa(job #645238)

Utilizator balakraz94abcd efgh balakraz94 Data 8 decembrie 2011 21:18:18
Problema Cuplaj maxim in graf bipartit Scor 8
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 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], edge[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;
    
	edge[sursa] = 0;
	
    while(!q.empty())
    {
        int x = q.front();
        q.pop();
        
        if(x==dest)
            continue;
        
        FOR(v[x])
            if((p->cap - p->flux) > 0  && !uz[p->nod])
            {
                uz[p->nod] = 1;;
                q.push(p->nod);
                edge[p->nod] = p; 
            }
    }
    
	if(!uz[dest])
		return 0;
	
	for( pmuchie p = v[dest]; p; p = edge[p->last->nod])
		p->flux++, p->last->flux--;
	
    return 1;
}



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;
}