Cod sursa(job #229743)

Utilizator hadesgamesTache Alexandru hadesgames Data 11 decembrie 2008 12:40:11
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
vector<vector<int> > a(10005);
int b[10005],c[10005],v[10005];
int cuplaj(int x)
{
	if (v[x])
		return 0;
	v[x]=1;
	vector<int>::iterator it;
	fori(it,a[x])
		if (!c[*it])
		{
			c[*it]=x;
			b[x]=*it;
			return 1;
		}
	fori(it,a[x])
		if (cuplaj(c[*it]))
		{
			c[*it]=x;
			b[x]=*it;
			return 1;
		}
	return 0;
}
int main()
{
	FILE *in,*out;
	int t,n,m,nr,nrc,i,x,y,d;
	in=fopen("java.in","r");
	out=fopen("java.out","w");
	fscanf(in,"%d",&t);
	for(;t;--t)
	{
		vector<vector<int> >(a).swap(a);
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		fscanf(in,"%d%d%d",&n,&m,&nr);
		FOR(i,1,nr)
		{
			fscanf(in,"%d%d",&x,&y);
			a[x].pb(y);
		}
		d=1;
		while (d)
		{
			d=0;
			memset(v,0,sizeof(v));
			FOR(i,1,n)
				if (!b[i])
					d|=cuplaj(i);
		}
		nrc=0;
		FOR(i,1,n)
			if(b[i])
				nrc++;
		fprintf(out,"%d\n",nrc);
	}
}