Cod sursa(job #597774)

Utilizator maritimCristian Lambru maritim Data 23 iunie 2011 11:26:48
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<stdio.h>
#include<malloc.h>
#include<vector>

#define MaxN 10100

typedef struct _nod
{
	int info;
	struct _nod *adr;
} nod;

typedef struct
{
	struct _nod *cap;
} list;

list A[MaxN];
bool viz[MaxN];
int st[MaxN];
int dr[MaxN];
int N;
int M;
int E;
int a;
int b;
int nr;

void add(int a,int b)
{
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = b;
	nou->adr = A[a].cap;
	A[a].cap = nou;
}

void citire(void)
{
	FILE *f = fopen("cuplaj.in","r");
	
	fscanf(f,"%d %d %d",&N,&M,&E);
	for(int i=1;i<=E;i++)
	{
		fscanf(f,"%d %d ",&a,&b);
		add(a,b);
	}
	
	fclose(f);
}

int cupleaza(int a)
{
	if(viz[a])
		return 0;
	viz[a] = true;
	nod *q = A[a].cap;
	while(q)
	{
		if(!dr[q->info])
		{
			viz[a] = true;
			st[a] = q->info;
			dr[q->info] = a;
			return 1;
		}
		q = q->adr;
	}
	q = A[a].cap;
	while(q)
	{
		if(cupleaza(dr[q->info]))
		{
			viz[a] = true;
			st[a] = q->info;
			dr[q->info] = a;
			return 1;
		}
		q = q->adr;
	}
	return 0;
}

void cuplaj(void)
{
	for(int i=1;i<=N;i++)
		if(!st[i])
			if(cupleaza(i))
				++ nr;
			else
			{
				memset(viz,false,sizeof(viz));
				if(cupleaza(i))
					++nr;
			}
		
}

void afisare(void)
{
	FILE *g = fopen("cuplaj.out","w");
	
	fprintf(g,"%d\n",nr);
	for(int i=1;i<=N;i++)
		if(st[i])
			fprintf(g,"%d %d\n",i,st[i]);
	
	fclose(g);
}

int main()
{
	citire();
	cuplaj();
	afisare();
	return 0;
}