Cod sursa(job #434343)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 5 aprilie 2010 17:54:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#include<vector>

#define N 10500
#define pb push_back

using namespace std;


int s[N], d[N], viz[N], n, m, e, ok, x;
vector< int > a[N];

void citire(){
int i, x, y;

	scanf("%d %d %d", &n, &m, &e);
	
	for (i = 1; i <= e; i++){
		scanf("%d %d", &x, &y);
		a[x].pb(y);
	}
}

int cuplaj(int nod){
int i;
	if (viz[nod]) return 0;
	viz[nod] = 1;
	
	for (i = 0; i < a[nod].size(); ++i)
		if(!s[a[nod][i]]){
			s[a[nod][i]] = nod;
			d[nod] = a[nod][i];
			return 1;
		}
	
	for (i = 0; i < a[nod].size(); ++i)
		if (cuplaj(s[a[nod][i]])){
			s[a[nod][i]] = nod;
			d[nod] = a[nod][i];
			return 1;
		}
		
	return 0;
}

int main(){
int i;
	freopen("cuplaj.in","r", stdin);
	freopen("cuplaj.out","w", stdout);
	
	citire();

	ok = 1;
	while (ok){
		ok = 0;
		memset(viz, 0, sizeof(viz));
		
		for (i = 1; i <= n; ++i)
			if (!d[i])
				if (cuplaj(i)){
					++x;
					ok = 1;
				}
	}
	printf("%d\n", x);
	for (i = 1; i <= n; i++)
		if (d[i])
			printf("%d %d\n", i, d[i]);
	
	return 0;
}