Cod sursa(job #1227749)

Utilizator lucian666Vasilut Lucian lucian666 Data 11 septembrie 2014 16:02:31
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
//Vasilut
#include<fstream>
#include<cstring>
#include<vector>

#define NN 10001
using namespace std;
ofstream out("cuplaj.out");

int uz[NN],st[NN],dr[NN],n,m,E,cuplaj;
vector<int>G[NN];
typedef vector<int>::iterator IT;

void read();
int pair_up(int start);
void fa_cuplaj();
void write();

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

void read()
{
    ifstream in("cuplaj.in");
    in>>n>>m>>E;
    for(int x,y; E; --E)
    {
            in>>x>>y;
            G[x].push_back(y);

    }
}

int pair_up(int start)
{
    if(uz[start])
    return 0;
    uz[start]=1;
    for(IT I=G[start].begin();I!=G[start].end();++I)
    if(!st[*I])
    {
        st[*I]=start;
        dr[start]=*I;
        return 1;
    }
    for(IT I=G[start].begin();I!=G[start].end();++I)
    if(pair_up(st[*I]))
    {
        st[*I]=start;
        dr[start]=*I;
        return 1;
    }
    return 0;
}

void fa_cuplaj()
{
    int ok=1;
    while(ok)
    {
        ok=0;
        memset(uz,0,sizeof(uz));
            for(int i=1;i<=n;i++)

                if( !dr[i] && pair_up(i))
                {
                    ++cuplaj;
                    ok=1;
                }
    }
}

void write()
{
    out<<cuplaj<<'\n';
    for(int i=1;i<=n;i++)
    if(dr[i])
    out<<i<<" "<<dr[i]<<'\n';
}