Cod sursa(job #570779)

Utilizator pykhNeagoe Alexandru pykh Data 3 aprilie 2011 16:31:02
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<vector>
#include<bitset>
using namespace std;

const char in[]="cuplaj.in";
const char out[]="cuplaj.out";

const int N_Max = 10005;

vector<int>G[N_Max];
bitset<N_Max>u;

int l[N_Max], r[N_Max];

int N, M, E, sol ;

bool cuplaj(int s)
	{
		if(u[s])return false;
		u[s] = true;
		
		for(vector<int>::iterator it = G[s].begin(); it != G[s].end() ; ++it)
		if(!r[*it])
		{
			l[s] = *it;
			r[*it] = s;
			return true;
		}
		
		for(vector<int>::iterator it = G[s].begin(); it != G[s].end() ; ++it)
			if(cuplaj(r[*it]))
			{
				l[s] = *it;
				r[*it] = s;
				return true;
			}
			
		return false;
}		



int main()
	{
		freopen(in,"r",stdin);
		freopen(out,"w",stdout);
		
		scanf("%d %d %d", &N, &M, &E);
		
		for(int i = 1, x, y ; i <= E ; ++i)
		{
			scanf("%d %d", &x, &y);
			G[x].push_back(y);
		}
		
		for(int ch ; ch ; )
		{
			u.reset();
			ch = 0;
			for(int i = 1 ; i <= N ; ++i)
				if(!l[i])ch = ch or cuplaj(i);
		}
		
		for(int i = 1 ; i <= N ; ++i)
			if(l[i])++sol;
		printf("%d\n", sol);
			
		for(int i = 1 ; i <= N ; ++i)
			if(l[i])
				printf("%d %d\n", i, l[i]);
		
		return 0;
}