Cod sursa(job #1829433)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 14 decembrie 2016 22:42:41
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define MaxN 10005
#define INF 2140000000

using namespace std;

FILE *IN,*OUT;

int A[MaxN],B[MaxN],M,Asize,Bsize,X,Y,Size=0;
vector <int>Graph[MaxN];
bool execute=true,used[MaxN];
bool DFS(int node)
{
	if(used[node])return false;
	else used[node]=true;
	for(int i=0;i<Graph[node].size();i++)
	{
		if(B[Graph[node][i]]==0)
		{
			A[node]=Graph[node][i];
			B[Graph[node][i]]=node;
			return true;
		}
		else if(DFS(B[Graph[node][i]]))
		{
			A[node]=Graph[node][i];
			B[Graph[node][i]]=node;
			return true;
		}
	}
	return false;
}
int main()
{
    IN=fopen("cuplaj.in","r");
    OUT=fopen("cuplaj.out","w");

	fscanf(IN,"%d%d%d",&Asize,&Bsize,&M);
	for(int i=1;i<=M;i++)
	{
		fscanf(IN,"%d%d",&X,&Y);
		Graph[X].push_back(Y);
	}
	while(execute)
	{
		int Add=0;
		memset(used,0,sizeof used);
		for(int i=1;i<=Asize;i++)
			if(A[i]==0)
				if(DFS(i))
					Add++;
		if(Add==0)
			execute=false;
		Size+=Add;
	}
	fprintf(OUT,"%d \n",Size);
	for(int i=1;i<=Asize;i++)
		if(A[i])fprintf(OUT,"%d %d\n",i,A[i]);
	return 0;
}