Cod sursa(job #932420)

Utilizator andreifirstCioara Andrei Ioan andreifirst Data 28 martie 2013 21:39:38
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

//#include <iostream>
ifstream cin("ciclueuler.in"); ofstream cout("ciclueuler.out");

struct pos{
	int x;
	vector<int>::iterator it;
};

typedef vector<int>::iterator iterator;

vector <int> v[100005];
int par[100005];
stack <pos> stk;
pos p;
vector<int>::iterator it;
int i, j, n, m, x, y, temp, times;
bool flg;

void del(vector<int> fv, int target){
	for (vector<int>::iterator fit=fv.begin();fit!=fv.end();fit++) 
		if ((*fit)==target){
			*fit=0;
			return;
		}
}

int main(){
	cin>>n>>m;
	for (i=1; i<=m; i++){
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
		par[x]++; par[y]++;
	}
	for (i=1; i<=n; i++) if (par[i]%2) {
		flg=1;
		break;
	}
	if (flg) cout<<-1;
	else {
		it = v[1].begin(); x=1;
		while (it!=v[x].end()){
			if ((*it)!=0){
				p.x = x; p.it = it;
				stk.push(p);
				
				temp=*it;
				for (vector<int>::iterator fit=v[temp].begin();fit!=v[temp].end();fit++) 
					if ((*fit)==x){
						*fit=0;
						break;
					}
				*it=0;
				
				x=temp;
				it=v[x].begin();
				continue;
			}
			it++;
			if (it==v[x].end() && !stk.empty()){
				if (times<m){
					times++;
					cout<<x<<" ";
				}
				x=stk.top().x;
				it=stk.top().it;
				stk.pop();
			}
		}
	}
	
	
}