Cod sursa(job #2509332)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 14 decembrie 2019 09:56:36
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <stack>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct muc{
	int a, b;
	bool vi = false;
	muc(){}
	muc(int a, int b) : a(a), b(b){}
	int oti(int x){
		if(x == a){
			return b;
		}else{
			return a;
		}
	}
};

int n, m;

muc muci[500041];
vector<int> gra[100041];

int dad[100041];

bool euler(){
	for(int i = 1; i <= n; i++){
		if(dad[i] % 2 != 0){
			return false;
		}
	}
	return true;
}

queue<int> qu;
bool viz[100041];
int findy(){
	for(int i = 1; i <= n; i++){
		if(dad[i] != 0){
			return i;
		}
	}
	return 1;
}

bool conecz(){
	int st = findy();
	
	qu.push(st);
	viz[st] = true;
	int x = st;
	while(!qu.empty()){
		int a = qu.front();
		qu.pop();
		for(auto mu : gra[a]){
			int b = muci[mu].oti(a);
			if(!viz[b]){
				x++;
				viz[b] = true;
				qu.push(b);
			}
		}
	}
	return (x==n);
}

void solve(){
	if(!euler() || !conecz()){
		fout << "-1";
	}else{
		stack<int> oflo;
		oflo.push(1);
		while(!oflo.empty()){
			int a = oflo.top();
			if(!gra[a].empty()){
				int mu = gra[a].back();
				gra[a].pop_back();
				if(!muci[mu].vi){
					muci[mu].vi = true;
					int b = muci[mu].oti(a);
					oflo.push(b);
				}
			}else{
				if(oflo.size() > 1){
					fout << a << " ";
				}
				oflo.pop();
			}
		}
	}
}

int main(){
	fin >> n >> m;
	for(int i = 0; i < m; ++i){
		int a, b;
		fin >> a >> b;
		muci[i] = muc(a, b);
		
		gra[a].push_back(i);
		gra[b].push_back(i);
		
		dad[a]++;
		dad[b]++;
	}
	solve();
	return 0;
}