Cod sursa(job #1414406)

Utilizator matei_cChristescu Matei matei_c Data 2 aprilie 2015 16:28:36
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
#include<climits>
using namespace std ;

#define maxn 10005

int N, M, E, nr ;

vector<int> graf[maxn] ;

bool sel[maxn] ;

int cuplaj[maxn], st[maxn] ;

bool dfs(int nod)
{
    if( sel[nod] == true )
        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 == 0 || dfs(de_unde) == true )
        {
            cuplaj[nod] = vecin ;
            st[vecin] = nod ;
            return true ;
        }
    }

    return false ;
}

int main()
{
	freopen("cuplaj.in", "r", stdin);
	freopen("cuplaj.out", "w", stdout);

    scanf("%d%d%d", &N, &M, &E);

    for(int i = 1; i <= E; ++i)
    {
        int x, y ;
        scanf("%d%d", &x, &y);

        graf[x].push_back(y) ;
    }

    bool cuplat = false ;

    while( cuplat == false )
    {
        cuplat = true ;

        memset( sel, 0, sizeof(sel) ) ;

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

    printf("%d\n", nr);

    for(int i = 1; i <= N; ++i)
        if( cuplaj[i] > 0 )
            printf("%d %d\n", i, cuplaj[i]);

	return 0 ;
}