Cod sursa(job #1307070)

Utilizator thinkphpAdrian Statescu thinkphp Data 31 decembrie 2014 22:58:32
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
#define FIN "ciclueuler.in"
#define FOUT "ciclueuler.out"
#define NMAX 500009

using namespace std;

vector<int> G[ NMAX ];
stack<int> STACK;

int le[ NMAX ], 

    ri[ NMAX ],

    sol[ NMAX ],

    num_nodes, 

    num_edges,

    i,

    x,

    y;
bitset<NMAX> vis;


//prototypes
void read();
int solve();
bool euler();
 
int main() {

    read(); 

    solve();        

    return(0);
};

void read() {

    freopen(FIN, "r", stdin);

    scanf("%d %d", &num_nodes, &num_edges);

    for(i = 1; i <= num_edges; i++) {

          scanf("%d %d", &le[ i ], &ri[ i ]);
 
          x = le[ i ];
          y = ri[ i ];

          G[ x ].push_back( i );  
          G[ y ].push_back( i );
    }     

    fclose( stdin ); 
};

bool euler() {

    for(i = 1; i <= num_nodes; i++) {

        if(G[ i ].size() & 1) {

           return 0; 
        }
    }

    return 1;
};

void dfs(int node) {

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

         if(!vis[ *it ]) {
              
             vis[ *it ] = 1;

             dfs(le[ *it ] + ri[ *it ] - node); 
         }
     }

     sol[++sol[0]] = node; 
};

int solve() {

    freopen(FOUT, "w", stdout);

    if( !euler() ) {

           printf("-1");

           return 0;
    }

    dfs(1);

    for(i = 1; i <= sol[0]; i++) printf("%d ", sol[ i ]); 

    fclose( stdout );
  
    return 1;
};