Cod sursa(job #2823080)

Utilizator lolotbogdanLolot Stefan-Bogdan lolotbogdan Data 26 decembrie 2021 21:07:45
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.35 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>

using namespace std;

class Graf
{
	int noduri, muchii;

	bool ciclu_eulerian(vector<vector<int>>& vecini, vector<int>& grade, vector<int>& componente_ciclu_eulerian);

public:
	Graf(int n, int m);
	void solve_ciclu_eulerian(ifstream& f, ofstream& o);

};

Graf::Graf(int n, int m)
{
	noduri = n;
	muchii = m;
}


bool Graf::ciclu_eulerian(vector<vector<int>>& vecini, vector<int>& grade, vector<int>& componente_ciclu_eulerian)
{
	for (int i = 1; i <= noduri; i++) // verific daca avem noduri de grad impar
		if (grade[i] % 2)
			return 0;

	int varf = 1; // cautam primul nod cu grad != 0

	while (varf <= noduri && grade[varf] == 0)
		varf++;

	if (varf == noduri + 1) // toate varfurile au gradul 0
		return 1;

	stack<int>st;
	st.push(varf);
	while (st.size())
	{
		varf = st.top();

		if (vecini[varf].size() == 0)
		{
			componente_ciclu_eulerian.push_back(varf);
			st.pop();
		}
		else
		{
			int varf2 = vecini[varf][0];
			vecini[varf].erase(vecini[varf].begin());

			for (int j = 0; j < vecini[varf2].size(); j++)
				if (vecini[varf2][j] == varf)
				{
					vecini[varf2].erase(vecini[varf2].begin() + j);
					break;
				}
			st.push(varf2);
		}

	}

	for (int i = 1; i <= noduri; i++)
		if (vecini[i].size())
			return 0;
}


void Graf::solve_ciclu_eulerian(ifstream& f, ofstream& o)
{
	vector<vector<int>>vecini(noduri + 1); // liste de adiacenta
	vector<int>grade(noduri + 1, 0); // vector in care sunt stocate gradele varfurilor
	vector<int>componente_ciclu_eulerian; // vector in care sunt stocate extremitatile muchiilor ce alcatuiesc ciclul eulerian(acolo unde exista unul)

	for (int i = 0; i < muchii; i++)
	{
		int x, y; // extremitatile unei muchii

		f >> x >> y;

		vecini[x].push_back(y);
		vecini[y].push_back(x);

		grade[x]++;
		grade[y]++;
	}

	if (ciclu_eulerian(vecini, grade, componente_ciclu_eulerian))
		for (int i = 0; i < componente_ciclu_eulerian.size() - 1; i++)
			o << componente_ciclu_eulerian[i] << " ";
	//cout << 1;
	else
		o << -1;
}

int main()
{
	ifstream f("ciclueuler.in");
	ofstream o("ciclueuler.out");

	int noduri, muchii;

	f >> noduri >> muchii;

	Graf g(noduri, muchii);

	g.solve_ciclu_eulerian(f, o);

	return 0;
}