Cod sursa(job #729809)

Utilizator hunter_ionutzzzFarcas Ionut hunter_ionutzzz Data 30 martie 2012 10:59:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
#define lung 10004
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int> v[lung];
int n,m,e,cuplu,dreapta[lung],stanga[lung];
bool viz[lung];
inline bool cuplez(int nod)
{int y,i;
    if (viz[nod])
		return false;
    viz[nod] = true;
    for(i=0;i<v[nod].size();i++)
    {   y = v[nod][i];
        if (!stanga[y] || cuplez(stanga[y]))//nu are vecin sau are vecin dar il pot cupla cu altul
        {   dreapta[nod] = y;
			stanga[y] = nod;
            return true;
        }
    }
    return false;
}

int main()
{int i,x,y;
 bool cupleaza;
    fin >> n >> m >> e;
    while (e--)
    {   fin >> x >> y;
        v[x].push_back(y);
    }
    cupleaza = true;
    while(cupleaza)
    {   cupleaza = false;
        for(i=1;i<=n;i++)
			viz[i]=0;
        for(i=1;i<=n;i++)
            if (!dreapta[i] && cuplez(i))//nu are vecin in dreapta si il pot cupla
            {   cupleaza = 1;
			    cuplu++;
	        }
    }
    fout << cuplu << '\n';
    for(i=1;i<=n;i++)
		if (dreapta[i])
			fout << i << ' ' << dreapta[i] << '\n';
    return 0;
}