Cod sursa(job #1642446)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 9 martie 2016 14:11:48
Problema Mesaj4 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <cstdio>
#include <vector>
#include <bitset>

const int DIM = 1 << 17;
using namespace std;

int N, M, X, Y, nr;
vector <int> Edge[DIM], NewEdge[DIM]; bitset <DIM> Marked;

void DFS1( int node, int &nr ) {
    Marked[node] = 1; nr ++;

    vector <int> :: iterator it;
    for( it = Edge[node].begin(); it != Edge[node].end(); it ++ ) {
        int next_node = *it;

        if( !Marked[next_node] ) {
            NewEdge[node].push_back( next_node );
            DFS1( next_node, nr );
        }
    }

    return;
}

void DFS2( int node ) {
    vector <int> :: iterator it;
    for( it = NewEdge[node].begin(); it != NewEdge[node].end(); it ++ ) {
        int next_node = *it;

        DFS2( next_node );
        printf( "%d %d\n", next_node, node );
    }

    return;
}

void DFS3( int node ) {
    vector <int> :: iterator it;
    for( it = NewEdge[node].begin(); it != NewEdge[node].end(); it ++ ) {
        int next_node = *it;

        printf( "%d %d\n", node, next_node );
        DFS3( next_node );
    }

    return;
}

int main() {

    freopen( "mesaj4.in" , "r", stdin  );
    freopen( "mesaj4.out", "w", stdout );

    scanf( "%d %d", &N, &M );
    for( int i = 1; i <= M; i ++ ) {
        scanf( "%d %d", &X, &Y );

        Edge[X].push_back( Y );
        Edge[Y].push_back( X );
    }

    DFS1( 1, nr );

    if( nr < N )
        printf( "-1\n" );
    else {
        printf( "%d\n", N * 2 - 2 );
        DFS2( 1 );
        DFS3( 1 );
    }

    return 0;
}