Cod sursa(job #1940086)

Utilizator Cudrici_CarinaCudrici Carina Cudrici_Carina Data 26 martie 2017 13:27:28
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <fstream>
#include <bitset>
#include <vector>

#define Nmax 100009
#define Mmax 500009
using namespace std;

ifstream fi("ciclueuler.in");
ofstream fo("ciclueuler.out");


int N,M,x,y;
vector<int> G[Mmax], Cycle;
pair<int,int> E[Mmax];
bitset<Mmax> viz;

int IsEulerian()
{
     for(int i = 1; i <= N; ++i)
          if(G[i].size() & 1) return 0;
     return 1;
}

inline void DFS(int node)
{
	while (G[node].size() )
	{
		if ( viz[G[node].back()] ) {G[node].pop_back();continue;}
		viz[G[node].back()] = 1;
		DFS( E[G[node].back()].first +  E[G[node].back()].second - node);
	}
    Cycle.push_back(node);
}

int main()
{
	fi >> N >> M;
	for(int i = 1; i <= M; ++i)
	{
        fi >> x >> y;
        G[x].push_back(i) ; G[y].push_back(i);      // G[x] retine muchiile in care apare x
        E[i] = {x, y};              // E[i] retine muchia i a grafului ca pair<x, y>
	}

    if(IsEulerian())
    {
        DFS(1);
        for(size_t i = 0; i < Cycle.size() - 1; ++i)
            fo << Cycle[i] << ' ';
        fo << '\n';
     }
     else fo << -1 << '\n';

     return 0;
}