Cod sursa(job #2127196)

Utilizator eilerGabriel-Ciprian Stanciu eiler Data 10 februarie 2018 13:57:47
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

struct muchie{
	int to, cod;
};

int n, m, c;
vector<muchie> L[100000];
bool viz[100000], ales[500000];

void parcurge(int v){
	viz[v]=true;

	for (size_t i=0; i<L[v].size(); i++)
		if (!viz[L[v][i].to]){
			viz[L[v][i].to]=true;
			parcurge(L[v][i].to);
		}
}

bool conex(){
	parcurge(0);

	for (int i=0; i<n; i++)
		if (!viz[i])
			return false;
	return true;
}

bool gradPar(){
	for (int i=0; i<n; i++)
		if (L[i].size() %2 ==1)
			return false;
	return true;
}

int main(){
	fstream f ("ciclueuler.in", ios_base::in);
	f >> n >> m;
	for (int i=0; i<m; i++){
		int x, y;

		f >> x >> y;
		x--; y--;

		L[x].push_back({y, c});
		L[y].push_back({x, c++});
	}
	f.close();

	f.open("ciclueuler.out", ios_base::out);
	if (!conex() && !gradPar())
		f << -1;
	else{
		stack<int> S;
		int r;
		size_t q;

		S.push(0);
		while (!S.empty()){
			r=S.top(); S.pop();

			q=0;
			while (q<L[r].size() && ales[L[r][q].cod]) q++;

			if (q!=L[r].size()){
				ales[L[r][q].cod]=true;
				S.push(r);
				S.push(L[r][q].to);
			}
			else
				f << r+1 << ' ';
		}
	}
	f.close();

	return 0;
}