Cod sursa(job #1499760)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 11 octombrie 2015 02:25:42
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;


ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");


const int NMAX = 100001;
const int MMAX = 500001;


int N; int M;


vector<int> cycle;
vector<int> G[NMAX];

stack<int> S;

int In[NMAX];

void read() {

	fin >> N >> M;

	for(int i = 1; i <= M; ++i) {

		int x; int y;
		fin >> x >> y;

		G[x].push_back(y);
		G[y].push_back(x);
		In[x]++;
		In[y]++;
	}

}

bool check_euler() {

	for(int i = 1; i <= N; ++i)
		if(In[i] % 2 !=  0)
			return 0;
	return 1;
}


void euler() {

	S.push(1);


	while(S.empty() == false) {
		
		int x = S.top();
		if(G[x].size() == 0) {

			//cand un nod nu mai are vecini insemna ca am terminat un ciclu
			//acum ori ma intorc si incep sa bag noduri care formeaza un alt ciclu(dar care se termina obligatoriu cu nodul pe care tocmai l.am bagat si care a inceput ciclul)
			//ori inchid acest si ma intorc pana ajung sa bag din nou acest nod 	x
			cycle.push_back(x); 
			S.pop();

		} else {


			int nody = G[x][ G[x].size() - 1];//iau ultimul nod , nu primul pentru ca vreau sa si il sterg usor
			
			G[x].pop_back();
			S.push(nody);

			for(unsigned i = 0 ; i < G[nody].size(); ++i)
				if(G[nody][i] == x) {
					swap(G[nody][i], G[nody][ G[nody].size() - 1 ]);
					break;
				}

			G[nody].pop_back();
			
		}
		
	}
}

int main() {

	read();

	if(!check_euler()) {
		fout << -1;
		return 0;
	}

	euler();

	for(unsigned i = 0 ; i < cycle.size() - 1; ++i)
		fout << cycle[i] << " ";
	
	return 0;
}