Cod sursa(job #1492735)

Utilizator tain1234andrei laur tain1234 Data 28 septembrie 2015 03:21:16
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <stack>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
vector<pair<int,int>> No[100001];
int gr[100001];
bool del[500005];
vector<int> cicle;
ifstream f("ciclueuler.in");
ofstream of("ciclueuler.out");
void euler(int root){
	stack<int> s;
	s.push(root);
	while (!s.empty()){
		int x = s.top();
		while (No[x].size() > 0 && del[No[x].back().second])No[x].pop_back();
		if (No[x].size() > 0){
			int c = No[x].back().first;
			del[No[x].back().second] = 1;
			No[x].pop_back();
			s.push(c);
		}
		else{
			of << x << " ";
			s.pop();
		}
	}
}
int main(){
	int N, M, a, b;
	string s;
	getline(f, s);
	int nr, j;
	nr = 0;
	j = 0;
	while (s[j] != ' '){
		nr = nr * 10 + s[j] - '0';
		++j;
	}
	N = nr;
	++j;
	nr = 0;
	while (j<s.size()){
		nr = nr * 10 + s[j] - '0';
		++j;
	}
	M = nr;
	for (int i = 1; i <= M; ++i){
		getline(f, s);
		nr = 0;
		j = 0;
		while (s[j] != ' '){
			nr = nr * 10 + s[j] - '0';
			++j;
		}
		a = nr;
		++j;
		nr = 0;
		while (j<s.size()){
			nr = nr * 10 + s[j] - '0';
			++j;
		}
		b = nr;
		No[a].push_back(make_pair(b,i));
		No[b].push_back(make_pair(a, i));
		++gr[a]; ++gr[b];
	}
	for (int i = 1; i <= N; ++i)
	if (gr[i] % 2 == 1) {
		of << -1; return 0;
	}
	euler(1);
}