Cod sursa(job #957040)

Utilizator matei_cChristescu Matei matei_c Data 4 iunie 2013 13:03:38
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<fstream>
#include<bitset>
#include<vector>
using namespace std ;

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

#define maxn 10001

int N, M, E ;

bitset<maxn> sel ;
vector<int> graf[maxn] ;
int st[maxn], cuplaj[maxn] ;

void citire()
{
    fin >> N >> M >> E ;
    for(int i = 0; i < E; ++i )
    {
        int x, y ;
        fin >> x >> y ;
        graf[x].push_back(y) ;
    }
}

bool dfs(int nod)
{
    if( sel[nod] )
        return false ;

    sel[nod] = true ;

    for(size_t i = 0; i < graf[nod].size(); ++i )
    {
        int vecin = graf[nod][i] ;
        int de_unde = st[vecin] ;

        if( de_unde == false || dfs( de_unde ) == true )
        {
            st[vecin] = nod ;
            cuplaj[nod] = vecin ;
            return true ;
        }
    }

    return false ;
}

int main()
{
    citire() ;

    int nr = 0 ;
    bool ok ;

    do
    {
        ok = false;

        for(int i = 1; i <= N; ++i )
        {
            if( cuplaj[i] == 0 && dfs(i) == true )
            {
                ++nr ;
                ok = true ;
            }
        }

        sel.reset() ;

    } while( ok == true ) ;

    fout << nr << "\n" ;

    for(int i = 1; i <= N; ++i )
        if( cuplaj[i] )
            fout << i << " " << cuplaj[i] << "\n" ;

    return 0 ;
}