Cod sursa(job #362312)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 8 noiembrie 2009 20:44:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

#define DIM 10001

int l[DIM], r[DIM], mod[DIM];
int n, m, nm;
vector<int> la[DIM];

int cupleaza(int nod)
{
	if(mod[nod]) return 0;
	mod[nod] = 1;
	
	vector<int> :: iterator it;
	
	for(it = la[nod].begin(); it != la[nod].end(); ++it)
	{
		if(r[*it] == 0) //daca vecinul curent e necuplat
		{
			r[*it] = nod;
			l[nod] = *it;
			return 1;
		}
	}
	for(it = la[nod].begin(); it != la[nod].end(); ++it)
	{
		if(cupleaza(r[*it])) //incerc sa recuplez pe cel cu care vecinul este cuplat ca sa pot cupla nod cu vecinul sau
		{
			r[*it] = nod;
			l[nod] = *it;
			return 1;
		}
	}
	return 0; //nu am reusit sa cuplez nodul
}

inline void noMod() { memset(mod, 0, DIM * sizeof(int)); }

void scrie()
{
	int noduriCuplate = 0, i;
	for(i = 1; i <= n; ++i) if(l[i] > 0) noduriCuplate++;
	ofstream fo("cuplaj.out");
	fo << noduriCuplate << "\n";
	for(i = 1; i <= n; ++i) if(l[i] > 0) fo << i << " " << l[i] << "\n";
	fo.close();
}

void rezolva()
{
	int schimbare = 1, i;
	while(schimbare)
	{
		schimbare = 0;
		noMod();
		for(i = 1; i <= n; ++i)
			if(!l[i])
				if(cupleaza(i))
					schimbare = 1;
	}
	
}

void citeste()
{
	ifstream fi("cuplaj.in");
	fi >> n >> m >> nm;
	int i, x, y;
	for(i = 1; i <= nm; ++i)
	{
		fi >> x >> y;
		la[x].push_back(y);
	}
	fi.close();
}

int main()
{
	citeste();
	rezolva();
	scrie();
	return 0;
}