Cod sursa(job #408276)

Utilizator loginLogin Iustin Anca login Data 2 martie 2010 22:34:36
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.91 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const char iname[] = "cuplaj.in";
const char oname[] = "cuplaj.out";

#define MAXN  10005
#define FOR(i, a, b)  for (int i = (int)(a); i <= (int)(b); ++ i)
#define FORI(i, V)    for (vector <int>::iterator i = (V).begin(); i != (V).end(); ++ i)

vector <int> G[MAXN];

int l[MAXN], r[MAXN], u[MAXN];


int pairup(const int n)
{
    if (u[n])  return 0;
    u[n] = 1;
    FORI (i, G[n]) if (!r[*i]) {
        l[n] = *i;
        r[*i] = n;
        return 1;
    }
    FORI (i, G[n]) if (pairup(r[*i])) {
        l[n] = *i;
        r[*i] = n;
        return 1;
    }
    return 0;
}

int main(void)
{
    freopen(iname, "r", stdin);
    freopen(oname, "w", stdout);

    int n, m, cnt_edges;
    scanf("%d %d %d", &n, &m, &cnt_edges);

    for (; cnt_edges --; )
    {
        int x, y;
        scanf("%d %d", &x, &y);
        G[x].push_back(y);
    }
    for (int change = 1; change; )
    {
        change = 0;
        memset(u, 0, sizeof(u));
        FOR (i, 1, n) if (!l[i])
            change |= pairup(i);
    }
    int cuplaj = 0;
    FOR (i, 1, n)  cuplaj += (l[i] > 0);
    printf("%d\n", cuplaj);
    FOR (i, 1, n) if (l[i] > 0)
        printf("%d %d\n", i, l[i]);

    return 0;
}



/*# include <fstream>
# include <iostream>
# include <cstdlib>
using namespace std;

int *a[10003], n, m , e, l[10003], r[10003], u[10003];

void add (int i, int j)
{
	a[i][0]++;
	a[i]=(int *)realloc(a[i], (a[i][0]+1)*4);
	a[i][a[i][0]]=j;
}

void read ()
{
	ifstream fin ("cuplaj.in");
	fin>>n>>m>>e;
	for (int i=1;i<=n;i++)
	{
		a[i]=(int *)malloc(4);
		a[i][0]=0;
	}
	int x, y;
	for (int i=1;i<=e;i++)
	{
		fin>>x>>y;
		add(x, y);
	}
}


int pairup (int k)
{
	if (u[k])
		return 0;
	u[k]=1;
	for (int i=1;i<=a[k][0];i++)
		if (!r[a[k][i]])
		{
			l[k]=a[k][i];
			r[a[k][i]]=k;
			return 1;
		}
	for(int i=1;i<=a[k][0];i++)
		if ( pairup( r[a[k][i]] ) )
		{
			l[k]=a[k][i];
			r[a[k][i]]=k;
			return 1;
		}
	return 0;
}

void solve ()
{
	int gata=0;
	while (!gata)
	{
		gata=1;
		for(int i=1;i<=n;i++)
			u[i]=0;
		for (int i=1;i<=n;i++)
			if (!l[i])
			{
				cout<<i<<endl;
				gata=0;
				pairup(i);
			}
	}
}

void write ()
{
	ofstream fout ("cuplaj.out");
	int cuplaj=0;
	for (int i=1;i<=n;i++)
		if (l[i]!=0)
			cuplaj++;
	fout<<cuplaj<<endl;
	for (int i=1;i<=n;i++)
		if (!l[i])
			fout<<i<<" "<<l[i]<<endl;
}

int main ()
{
	read();
	solve ();
	write ();
	return 0;
}




















/*# include <vector>
# include <iostream>
# include <algorithm>
# include <cstdio>
using namespace std;

vector<int>g[10003];
int l[10003], r[10003], u[10003], n, m, e;

void read ()
{
	freopen ("cuplaj.in", "r", stdin);
	scanf("%d%d%d", &n, &m, &e);
	for (;e--;)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		g[x].push_back(y);
	}
}

int pereche (int k)
{
	if (u[k])
		return 0;
	cout<<"$";
	u[k]=1;
	for (vector<int>::iterator I=g[k].begin();I!=g[k].end();++I)
		if (!r[*I])
		{
			cout<<*I<<endl;
			l[k]=*I;
			r[*I]=n;
			return 1;
		}
	for (vector<int>::iterator I=g[k].begin();I!=g[k].end();++I)
		if (pereche(r[*I]))
		{
			l[k]=*I;
			r[*I]=k;
			return 1;
		}
	return 0;
}

void solve ()
{
	int gata=0;
	while (!gata)
	{
		gata=1;
		for (int i=1;i<=n;++i)
			u[i]=0;	
		for (int i=1;i<=n;++i)
			if (!l[i])
			{
			cout<<i<<endl;cout.flush();			
				gata=0;
				pereche(0);

		//		cout<<i;
			}
	}
}	

void write ()
{
	int cuplaj=0;
	for (int i=1;i<=n;i++)
		if (l[i]>0)
			cuplaj++;
	freopen("cuplaj.out", "w", stdout);
	printf("%d\n", cuplaj);
	for(int i=1;i<=n;i++)
		if (l[i]>0)
			printf("%d %d\n", i, l[i]);
}

int main ()
{
	read();
	for (int i=1;i<=n;i++)
	{
		cout<<i<<" : ";
		for (vector<int>::iterator I=g[i].begin();I!=g[i].end();++I)
			cout<<*I<<" ";
		cout<<endl;
	}
	solve ();
	write ();
	return 0;
}

*/