Cod sursa(job #1638228)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 7 martie 2016 21:55:50
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>
using namespace std;

bool e_eulerian(const vector<vector<int> >& graf){
	for(int i = 0; i < graf.size(); ++i){
		if(graf[i].size()%2 != 0){
			return false; } }
	return true; }

void mk_euler(vector<vector<int> >& graf, const vector<int>& muchii, vector<int>& rez){
	const int n = graf.size(), m = muchii.size();

	vector<bool> use(m, false);
	vector<int> drum(1, 0);

	while(!drum.empty()){
		const int cur = drum.back();
		while(!graf[cur].empty() && use[graf[cur].back()]){
			graf[cur].pop_back(); }
		if(graf[cur].empty()){
			rez.push_back(cur);
			drum.pop_back(); }
		else{
			use[graf[cur].back()] = true;
			drum.push_back(muchii[graf[cur].back()] ^ cur); } } }

int main(){
	ifstream f("ciclueuler.in");
	ofstream g("ciclueuler.out");
	int n, m;
	f >> n >> m;

	vector<vector<int> > graf(n);
	vector<int> muchii(m);

	for(int i = 0, a, b; i < m; ++i){
		f >> a >> b;
		--a, --b;
		muchii[i] = (a ^ b);
		graf[a].push_back(i);
		graf[b].push_back(i); }

	if(!e_eulerian(graf)){
		g << -1;
		return 0; }
	vector<int> rez;
	mk_euler(graf, muchii, rez);

	for(int i = 0; i < rez.size()-1; ++i){
		g << rez[i]+1 << ' '; }

	return 0; }