Cod sursa(job #1953171)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 4 aprilie 2017 17:56:40
Problema Strazi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;

fstream in ( "strazi.in" , ios::in  );
fstream out( "strazi.out", ios::out );

const int DIM = 3e2 + 5;

int lef[DIM], rig[DIM];

bitset<DIM> oki;
vector<int> edg[DIM]; vector<vector<int>> lst;

bool slv( int x ) {
    if( oki[x] == true )
        return false;
    oki[x] = true;
    
    for( int y : edg[x] ) {
        if( rig[y] == 0 ) {
            lef[x] = y;
            rig[y] = x;
            
            return true;
        }
    }
    
    for( int y : edg[x] ) {
        if( slv( y ) == true ) {
            lef[x] = y;
            rig[y] = x;
            
            return true;
        }
    }
    
    return false;
}

void dfs( int x ) {
    oki[x] = true;
    lst.back().push_back( x );
    
    if( lef[x] != 0 )
        dfs( lef[x] );
    
    return;
}

int main( void ) {
    
    int n, m;
    in >> n >> m;
    
    for( int i = 1; i <= m; i ++ ) {
        int x, y;
        in >> x >> y;
        
        edg[x].push_back( y );
    }
    
    bool ok;
    do {
        ok = true; oki.reset();
        for( int i = 1; i <= n; i ++ ) {
            if( lef[i] == 0 && slv( i ) == true )
                ok = false;
        }
    } while( ok == true );
    
    oki.reset();
    for( int i = 1; i <= n; i ++ ) {
        if( oki[i] == false ) {
            lst.push_back( vector<int>(0) );
            dfs( i );
        }
    }
    
    out << lst.size() - 1 << "\n";
    for( int i = 1; i < lst.size(); i ++ )
        out << lst[i - 1].back() << " " << lst[i].front() << "\n";
    for( vector<int> ls : lst )
        for( int x : ls )
            out << x << " ";
    out << "\n";
    
    return 0;
}