Cod sursa(job #1174486)

Utilizator sorin2kSorin Nutu sorin2k Data 22 aprilie 2014 23:29:48
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;

int n, m, Q[500001];
bitset<100000> degree;
vector<int> adj[100000];
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

bool is_eulerian() {
	int i;
	for(i = 0; i < n; i++) {
		if(degree[i] == 1) return false;
	}
	return true;
}

void compute() {
	int current;
	Q[++Q[0]] = 0;
	while(Q[0] > 0) {
		current = Q[Q[0]];
		if(adj[current].size() > 0) {
			Q[++Q[0]] = adj[current].back();
			adj[current].pop_back();
			for(vector<int>::iterator it = adj[Q[Q[0]]].begin(); it != adj[Q[Q[0]]].end(); ++it) {
				if(*it == current) {
					adj[Q[Q[0]]].erase(it);
					break;
				}
			}
		} else {
			Q[0]--;
			if(Q[0]) fout << current+1 << " ";
		}
	}
}

int main() {
	int i, u, v;

	fin >> n >> m;
	for(i = 0; i < m; i++) {
		fin >> u >> v;
		adj[u-1].push_back(v-1);
		adj[v-1].push_back(u-1);
		degree[u-1].flip();
		degree[v-1].flip();
	}
	if(is_eulerian()) {
		compute();
	} else {
		fout << -1;
	}
	return 0;
}