Cod sursa(job #729250)

Utilizator R.A.RFMI Romila Remus Arthur R.A.R Data 29 martie 2012 13:50:32
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <vector>
#define nmax 10004

using namespace std;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

vector<int> V[nmax];
int N,M,E,cuplu,Right[nmax],Left[nmax];
bool Viz[nmax];

inline bool Cuplez(int nod)
{
    int y,i;
    if(Viz[nod])return 0;
    Viz[nod] = 1;
    for(i=0;i<V[nod].size();i++)
    {
        y = V[nod][i];
        if(!Left[y]||Cuplez(Left[y]))//nu are vecin sau are vecin dar il pot cupla cu altul
        {
            Right[nod]  =y,Left[y] = nod;
            return 1;
        }
    }
    return 0;
}

int main()
{
    int i,x,y;
    bool cupleaza;
    in>>N>>M>>E;
    while(E--)
    {
        in>>x>>y;
        V[x].push_back(y);
    }
    cupleaza=1;
    while(cupleaza)
    {
        cupleaza = 0;
        for(i=1;i<=N;i++)Viz[i]=0;
        for(i=1;i<=N;i++)
            if(!Right[i]&&Cuplez(i))//nu are vecin in dreapta si il pot cupla
                cupleaza = 1,cuplu++;
    }
    out<<cuplu<<'\n';
    return 0;
}