Cod sursa(job #2288437)

Utilizator cezar.plescaCezar Plesca cezar.plesca Data 23 noiembrie 2018 14:01:31
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include<stdio.h>
#include<stdlib.h>

#include<queue>
#include<stack>
#include<vector>
#include<list>

#include <fstream>
#include <iostream>

using namespace std;

#define MAXN 100000
#define MAXM 500000

int M,N;
bool ciclu;

list<int> L[MAXN];
int D[MAXN];

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

stack<int> S;
vector<int> C;

void ciclueulerian(){
	S.push(0);
	int nod,vecin;
	list<int>::iterator it;
	bool go=false;
	while(!S.empty()){
		nod=S.top();
		go=false;
		while(!L[nod].empty()){
			vecin=L[nod].front();
			L[nod].pop_front();
			if(nod!=vecin){
				for (it=L[vecin].begin(); it!=L[vecin].end(); it++){ 
					if(*it==nod){
						L[vecin].erase(it);
						break;
					}
				}
			}
			S.push(vecin);
			go=true;
			break;
		}
		if(go)
			continue;
		C.push_back(nod);
		S.pop();
	}
	if(C.size()<M)
		ciclu=false;
}

int main(){
		
	fin >> N >> M;

	int x,y;

	for(int i=0;i<M;i++){
		fin >> x >> y;
		L[x-1].push_back(y-1);
		if(x!=y){
			L[y-1].push_back(x-1);
			D[x-1]++;
			D[y-1]++;
		}
	}

	ciclu=true;
	for(int i=0;i<N;i++){
		if(D[i]%2==1){
			ciclu=false;
			break;
		}
	}

	if(ciclu)
		ciclueulerian();

	if(!ciclu)
		fout << -1 << endl;
	else{
		for(int i=0;i<M;i++)
			fout << C[i]+1 << " ";
	}

	fin.close();
    fout.close();

	return 0;
}