Cod sursa(job #654356)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 30 decembrie 2011 12:41:13
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<fstream>
#include<vector>
using namespace std;
int m;
short na,nb,st[10100],dr[10100];
bool viz[10100];
vector <short> G[10100];

void Citire()
{
	int i;
	short x,y;
	ifstream fin("cuplaj.in");
	fin>>na>>nb>>m;
	for(i=1;i<=m;i++)
	{
		fin>>x>>y;
		G[x].push_back(y);
	}
	fin.close();
}

inline bool Hopcroft_Karp(short nod)
{
	if(viz[nod]==true)
		return false;
	viz[nod]=true;
	
	vector <short>::iterator it;
	for(it=G[nod].begin();it!=G[nod].end();it++)
	{
		if(!st[*it])
		{
			st[*it]=nod;
			dr[nod]=*it;
			return true;
		}
	}
	for(it=G[nod].begin();it!=G[nod].end();it++)
	{
		if(Hopcroft_Karp(st[*it])==true)
		{
			st[*it]=nod;
			dr[nod]=*it;
			return true;
		}
	}
	return false;
}

void Rezolvare()
{
	short i;
	bool modificare=true;
	while(modificare)
	{
		modificare=false;
		for(i=1;i<=na;i++)
		{
			if(!dr[i])
			{
				if(Hopcroft_Karp(i)==true)
					modificare=true;
			}
		}
		for(i=1;i<=na;i++)
			viz[i]=false;
	}
}

void Afisare()
{
	int i,nrcuplaj=0;
	for(i=1;i<=na;i++)
	{
		if(dr[i])
			nrcuplaj++;
	}
	ofstream fout("cuplaj.out");
	fout<<nrcuplaj<<"\n";
	for(i=1;i<=na;i++)
	{
		if(dr[i])
			fout<<i<<' '<<dr[i]<<"\n";
	}
	fout.close();
}

int main()
{
	Citire();
	Rezolvare();
	Afisare();
	return 0;
}