Cod sursa(job #497038)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 1 noiembrie 2010 15:06:50
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
#include<vector>
#define N 1<<14
using namespace std;
int n,m,e,a,b,i,cd[N],ci[N],viz[N],cuplaje,creste(int ic);
vector<int> v[N];
void read(),solve();
int main()
{   read();
    solve();
    return 0;
}
void read()
{
	freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    scanf("%d%d%d",&n,&m,&e);
    for(i=1;i<=e;i++)
    {
		scanf("%d%d",&a,&b);
		v[a].push_back(b);
	}
}
void solve()
{
	int gata=0;
    for(;!gata;)
	{
		gata=1;
		for(i=1;i<=n;i++)viz[i]=0;
		for(i=1;i<=n;i++)
			if(!cd[i]&&creste(i))
			{
				gata=0;
				cuplaje++;
			}
	}
	printf("%d\n",cuplaje);
    for(i=1;i<=n;i++)
		if(cd[i])printf("%d %d\n",i,cd[i]);
}
int creste(int ic)
{
	if (viz[ic]) return 0;
    vector<int>::iterator it;
	viz[ic] = 1;
    for(it=v[ic].begin();it!=v[ic].end();it++)
		if (!ci[*it]){ci[*it]=ic;cd[ic]=*it;return 1;}
    for(it=v[ic].begin();it!=v[ic].end();it++)
		if (creste(ci[*it])){ci[*it]=ic;cd[ic]=*it;return 1;}
    return 0;
}