Cod sursa(job #1707024)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 24 mai 2016 00:09:48
Problema Cuplaj maxim in graf bipartit Scor 28
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <vector>
#include <bitset>

const int SIZE = 1e5 + 5;

int left[SIZE], right[SIZE], n, m, k, x, y, answer, ok;
std::vector <int> edge[SIZE]; std::bitset <SIZE> marked;

inline bool vertex_cover( int node ) {
    std::vector <int> :: iterator it;
    
    if( marked[node] )
        return false;
    marked[node] = 1;
    
    for( it = edge[node].begin(); it != edge[node].end(); it ++ ) {
        int next_node = *it;
        
        if( !right[next_node] ) {
            left[node] = next_node;
            right[next_node] = node;
            answer ++;
            
            return true;
        }
    }
    
    for( it = edge[node].begin(); it != edge[node].end(); it ++ ) {
        int next_node = *it;
        
        if( vertex_cover(next_node) ) {
            left[node] = next_node;
            right[next_node] = node;
            
            return true;
        }
    }
    
    return false;
}

int main( int argc, const char *argv[] ) {
    
    freopen( "cuplaj.in" , "r", stdin  );
    freopen( "cuplaj.out", "w", stdout );
    
    scanf( "%d %d %d", &n, &m, &k );
    
    for( int i = 1; i <= k; i ++ ) {
        scanf( "%d %d", &x, &y );
        edge[x].push_back(y);
    }
    
    do {
        marked.reset(); ok = 1;
        
        for( int i = 1; i <= n; i ++ ) {
            if( !left[i] && vertex_cover(i) )
                ok = 0;
        }
    } while( !ok );
    
    printf( "%d\n", answer );
    
    for( int i = 1; i <= n; i ++ ) {
        if( left[i] )
            printf( "%d %d\n", i, left[i] );
    }
    
    return 0;
}