Cod sursa(job #1192866)

Utilizator danalex97Dan H Alexandru danalex97 Data 29 mai 2014 20:54:06
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

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

#define IT(type) vector<type>::iterator

const int Nmax = 10010;

int N,M,E,paired[Nmax];
int left_pair[Nmax],right_pair[Nmax];
vector<int> V[Nmax];

bool pair_node(int lnode)
{
    if ( lnode == 0 )
        return 1;
    paired[lnode] = 1;
    for (IT(int) rnode=V[lnode].begin();rnode!=V[lnode].end();++rnode)
        if ( paired[ left_pair[*rnode] ] == 0 )
            if ( pair_node( left_pair[*rnode] ) == 1 )
            {
                left_pair[*rnode] = lnode;
                right_pair[lnode] = *rnode;
                return 1;
            }
    return 0;
}

int main()
{
    F>>N>>M>>E;
    for (int i=1,x,y;i<=E;++i)
    {
        F>>x>>y;
        V[ x ].push_back( y );
    }

    bool better = 1;
    int out = 0;

    while ( better )
    {
        better = 0;
        memset(paired,0,sizeof(paired));
        for (int i=1;i<=N;++i)
            if ( right_pair[i] == 0 && pair_node( i ) == 1 )
                ++out , better = 1;
    }

    G<<out<<'\n';
    for (int i=1;i<=N;++i)
        if ( right_pair[i] != 0 )
            G<<i<<' '<<right_pair[i]<<'\n';
}