Cod sursa(job #240059)

Utilizator RobybrasovRobert Hangu Robybrasov Data 6 ianuarie 2009 19:28:17
Problema Cuplaj maxim in graf bipartit Scor 32
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <cstdio>
#include <vector>
#define N 10001

using namespace std;

int tata[N],n,m,e,i,x,y,flux;
short int E[N];
vector<int> L[N];

int dfs(int nod)
{
    if (nod==-1) return 1;
    if (E[nod]) return 0;
    E[nod]=1;
    vector<int>::iterator it;
    for (it=L[nod].begin(); it!=L[nod].end(); it++)
        if (dfs(tata[*it]))
        {
            tata[*it]=nod;
            return 1;
        }
    return 0;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d%d%d\n",&n,&m,&e);
	for (i=1; i<=e; i++)
	{
	    scanf("%d%d\n",&x,&y);
	    L[x].push_back(y);
	}
	memset(tata,-1,sizeof(tata));
	flux=0;
	for (i=1; i<=n; i++)
    {
        memset(E,0,sizeof(E));
        if (dfs(i)) flux++;
    }
    printf("%d\n",flux);
    for (i=1; i<=m; i++)
        if (tata[i]) printf("%d %d\n",tata[i],i);

    return 0;
}