Cod sursa(job #645227)

Utilizator balakraz94abcd efgh balakraz94 Data 8 decembrie 2011 20:53:42
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include<cstdio>
#include<vector>
#include<bitset>
#include<queue>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define n_max 10005
#define pb push_back
#define INF 1<<30
#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(pmuchie &p, int x)
{
	pmuchie q = new muchie;
	q->nod = x;
	q->cap = 1;
	q->flux = 0;
	q->urm = p;
	p = q;
}



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(v[x],y+n);
	   add(v[y+n],x);
	   v[x]->last = v[y+n];
	   v[y+n]->last = v[x];
    }
    
    sursa = 0;
    for(int i=1;i<=n;i++)
    {
        add(v[sursa],i);
		add(v[i],sursa);
		v[sursa]->last = v[i];
		v[i]->last = v[sursa];
    }
    
    dest = n+m+1;
    for(int i=n+1;i<=n+m;i++)
    {
        add(v[dest],i);
		add(v[i],dest);
		v[dest]->last = v[i];
		v[i]->last = v[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 rezolva()
{
    while(bfs())
		cuplaj++;
}




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();
    rezolva();
    afiseaza();
    
    return 0;
}