Cod sursa(job #1436212)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 15 mai 2015 14:48:57
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <stack>

#define NMax 100010

using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

vector<int> G[NMax], L;
stack<int> mstack;
bool mark[100010];
int nodes, edges, n1, n2, deg[NMax], recCic[NMax];

void dfs(int node)
{
	for (vector<int>::iterator it = G[node].begin(); it != G[node].end(); it++) {
		if (!mark[*it]) {
			mark[*it] = true;
			dfs(*it);
		}
	}
}

bool isEuler()
{
	dfs(1);

	bool ok = false;
	for (int i = 1; i <= nodes; i++) {
		if (deg[i] % 2 != 0 || !mark[i]) {
			ok = true;
			break;
		}
	}

	if (ok == true)
		return false;

	return true;
}

void deleteEdge(int n1, int n2)
{
	vector<int>::iterator it;

	for (it = G[n1].begin(); it != G[n1].end(); it++) {
		if (*it == n2) {
			G[n1].erase(it);
			break;
		}
	}

	for (it = G[n2].begin(); it != G[n2].end(); it++) {
		if (*it == n1) {
			G[n2].erase(it);
			break;
		}
	}
}

int euler()
{
	if (!isEuler()) {
		g << -1;
		return 0;
	}
	else {
		mstack.push(1);

		while (!mstack.empty()) {
			int node = mstack.top();

			if (!G[node].empty()) {
				mstack.push(G[node].front());

				deleteEdge(node, G[node].front());				
			}
			else {
				L.push_back(node);
				mstack.pop();
			}
		}
	}

	return 0;
}

int main()
{
	f >> nodes >> edges;

	for (int i = 1; i <= edges; i++) {
		f >> n1 >> n2;

		G[n1].push_back(n2); deg[n1]++;
		G[n2].push_back(n1); deg[n2]++;
	}

	euler();

	vector<int>::iterator it;
	for (it = L.begin(); it != L.end(); it++)
		g << *it << " ";

	return 0;
}