Cod sursa(job #681278)

Utilizator balakraz94abcd efgh balakraz94 Data 16 februarie 2012 20:39:21
Problema Cuplaj maxim in graf bipartit Scor 24
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include<cstdio>
#include<vector>
#include<bitset>
#define infile "cuplaj.in"
#define outfile "cuplaj.out"
#define n_max 20005
#define nxt *it
#define pb push_back
#define FOR(g) \
    for(vector<int> :: iterator it = g.begin(); it!=g.end(); ++it)
using namespace std;

vector < int > v[n_max];

int R[n_max], L[n_max];

bitset < n_max > done;

int N, M;

int Cuplaj;


void citeste()
{
    freopen(infile,"r",stdin);
    
    int E, x, y;
    
    scanf("%d %d %d",&N, &M, &E);
    
    while(E--)
    {
	   scanf("%d %d",&x,&y);
        
       v[x].pb(y);
    }
	
    fclose(stdin);
}


int pair_up(int x)
{
	if(done[x])//daca x a mai fost folosit
		return 0;
	done[x] = 1;//il marchez
	
	FOR(v[x])//iau toti vecinii din dreapta( nxt )
	    if(!R[nxt])//daca nxt nu este cuplat
		{
			L[x] = nxt;//il cuplez pe x cu nxt
			R[nxt] = x;//il cuplez pe nxt cu x
			return 1;//am reusit sa-l cuplez pe x
		}
		
	FOR(v[x])//iau toti vecinii din dreapta( nxt ) -> nu am gasit niciun vecin necuplat
        if(pair_up(nxt))//il cuplez pe nxt cu alt nod
		{
			L[x] = nxt;//il cuplez pe x cu nxt
			R[nxt] = x;//il cuplez pe nxt cu x
			return 1;//am reusit sa-l cuplez pe x
		}
	return 0;//x nu a putut fi cuplat
}



void rezolva()
{
	for(int ok = 1; ok; )//cat timp exista modificari
	{
		ok = 0;
		done.reset();
		for(int i=1; i<=N; ++i)
			if(!L[i])//daca i nu este cuplat
				ok |= pair_up(i);//incerc sa-l cuplez
	}
	
	for(int i=1; i<=N; ++i)
		Cuplaj += (L[i] > 0);//daca i este cuplat Cuplaj++
}


void afiseaza()
{
    freopen(outfile,"w",stdout);
    
    printf("%d\n",Cuplaj);
	
	for(int i=1; i<=N; ++i)
		if(L[i] > 0)//daca i este cuplat
			printf("%d %d\n",i, L[i]);//afisez cupaljul i - L[i]
    
    fclose(stdout);
}


int main()
{
    citeste();
	
    rezolva();
	
    afiseaza();
    
    return 0;
}