Cod sursa(job #716475)

Utilizator halianStefanca Stefan halian Data 18 martie 2012 21:19:17
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>
#include <vector>
using namespace std;
#define FI fopen("cuplaj.in","r")
#define FO fopen("cuplaj.out","w")

vector<int> nodLeg[2][10001];
int nodLen[2],nrSol;
int cup[2][10001];
int nod[2][10001]; //0 - left; 1 - right

void citeste(FILE *f) {
	long e,i;
	int a,b;
	fscanf(f,"%i%i%li",&nodLen[0],&nodLen[1],&e);
	for(i=0;i<e;i++) {
		fscanf(f,"%i%i",&a,&b);
		nodLeg[0][a].push_back(b);
		nodLeg[1][b].push_back(a);
	}
}

void scrie(FILE *f) {
	int i,j;
	fprintf(f,"%i\n",nrSol);
	for(i=0,j=0;i<nodLen[0] && j<nrSol;i++)
		if(cup[0][i+1]) {
			fprintf(f,"%i %i\n",i+1,cup[0][i+1]);
			j++;
		}
}

int resolveCuplaj(int nodA,int nodSide) {
	int i,lim;
	lim=nodLeg[nodSide][nodA].size();
	nod[nodSide][nodA]=1;
	for(i=0;i<lim;i++)
		if(cup[nodSide^1][nodLeg[nodSide][nodA][i]]==0 && nod[nodSide^1][nodLeg[nodSide][nodA][i]]==0) {
			cup[nodSide^1][cup[nodSide][nodA]]=0;
			cup[nodSide^1][nodLeg[nodSide][nodA][i]]=nodA;
			cup[nodSide][nodA]=nodLeg[nodSide][nodA][i];
			nod[nodSide][nodA]=0;
			return 1;
		}
	for(i=0;i<lim;i++)
		if(nod[nodSide^1][nodLeg[nodSide][nodA][i]]==0) {
			nod[nodSide^1][nodLeg[nodSide][nodA][i]]=1;
			if(resolveCuplaj(cup[nodSide^1][nodLeg[nodSide][nodA][i]],nodSide)) {
				cup[nodSide^1][nodLeg[nodSide][nodA][i]]=nodA;
				cup[nodSide][nodA]=nodLeg[nodSide][nodA][i];
				nod[nodSide][nodA]=0;
				nod[nodSide^1][nodLeg[nodSide][nodA][i]]=0;
				return 1;
			}
			nod[nodSide^1][nodLeg[nodSide][nodA][i]]=0;
		}
	nod[nodSide][nodA]=0;
	return 0;
}

int main() {
	int i;
	citeste(FI);
	for(i=0;i<nodLen[0];i++) {
		nrSol+=resolveCuplaj(i+1,0);
	}
	scrie(FO);
	return 0;
}