Cod sursa(job #663738)

Utilizator marinMari n marin Data 18 ianuarie 2012 21:37:56
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <stdio.h>
#include <string.h>
#define DIM 10010

struct nod {
	int inf;
	nod *adr;
};

int L[DIM], R[DIM], U[DIM], N, i, A,  B, C, x, y, rez, gata;
nod *V[DIM], *q;

int cupleaza (int i) {
	if (U[i] == 1)
		return 0;
	U[i] = 1;
	for (nod *q = V[i];q!=NULL;q = q -> adr) {
		if (R[q->inf] == 0) {
			L[i] = q->inf;
			R[q->inf] = i;
			return 1;
		}
	}
	for (nod *q = V[i];q!=NULL;q = q -> adr) {
		if (cupleaza(R[q->inf])) {
			L[i] = q->inf;
			R[q->inf] = i;
			return 1;
		}
	}
	
	return 0;
}


int main() {
	FILE *f = fopen("cuplaj.in","r");
	FILE *g = fopen("cuplaj.out","w");
	fscanf(f,"%d %d %d",&A, &B, &C);
	for (i=1;i<=C;i++) {
		fscanf(f,"%d %d",&x, &y);
		q = new nod;
		q->inf = y;
		q->adr = V[x];
		V[x] = q;
	}
	
	do {
		gata = 1;
		memset(U, 0, sizeof(U));
		for (i=1;i<=A;i++)
			if (L[i] == 0 && cupleaza(i)) {
				gata = 0;
			}
	} while (! gata);
	
	for (i=1;i<=A;i++)
		if (L[i] != 0)
			rez++;
	fprintf(g,"%d\n",rez);
	for (i=1;i<=A;i++)
		if (L[i])
			fprintf(g,"%d %d\n",i,L[i]);
	return 0;
}