Cod sursa(job #690299)

Utilizator andrey932Andrei andrey932 Data 25 februarie 2012 15:03:16
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

#define MAXN 100003
#define MAXM 500003
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct much {
	int urm;
	int coresp;
};

int n,m,i,j,a,b,nod,urm;
vector<much> graf[MAXN];
vector<int> st,rezultat; //STIVA
much maux;

void citire() {
	fin>>n>>m;
	for(i=0;i<m;i++) {
		fin>>a>>b;
		maux.urm=b;
		maux.coresp=graf[b].size();
		graf[a].push_back(maux);
		maux.urm=a;
		maux.coresp=graf[a].size()-1;
		graf[b].push_back(maux);
	}
}

bool verif() {
	for(i=1;i<=n;i++) {
		if (graf[i].size()%2!=0) return false;
		if ( (nod==0) && (graf[i].size()!=0) ) nod=i;
	}
	return true;
}


void rez() {
	st.push_back(nod);
	while (!st.empty()) {
		nod=st.back();
		//cout<<nod;
		i=graf[nod].size()-1;
		while ((graf[nod][i].urm==0) && (i>=0)) {
			graf[nod].pop_back();
			i--;
		}
		//cout<<" -> ?"<<graf[nod][i].urm;
		if (i<0) {
			rezultat.push_back(nod);
			st.pop_back();
			//cout<<"  (NU)  i="<<i;
		}
		else {
			urm=graf[nod][i].urm;
			if (graf[urm].size()>graf[nod][i].coresp) {
				graf[urm][graf[nod][i].coresp].urm=0;
			}
			graf[nod].pop_back();
			st.push_back(urm);
			//cout<<"  (DA)";
		}
		//cout<<"\n";
		
	}	
}

int main() {
	citire();
	if (verif()) {
		rez();
		for(i=rezultat.size()-1;i>0;i--) {
			fout<<rezultat[i]<<" ";
		}
		fout<<"\n";
	}
	else {fout<<"-1\n";}
	
	
	fout.close();	
	return 0;
}