Cod sursa(job #2079002)

Utilizator WebDesignbyTMGhiorghiu Ioan-Viorel WebDesignbyTM Data 30 noiembrie 2017 13:30:42
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#define DM 100001
#define DN 500001
#include <bitset>
#include <fstream>
#include <vector>
using namespace std;

ifstream fi ("ciclueuler.in");
ofstream fo ("ciclueuler.out");
bitset <DN> bs;//muchii folosite
int n, m, nod, dest, sens1[DN], sens2[DN];//sens - capetele muchiilor
vector <int> v[DM], stk, rasp;//v - muchiile fiecarui nod; stk - stack simulat; rasp - ciclu final

int main()
{
	//citire
	fi >> n >> m;
	for (int i = 1; i <= m; ++i)
	{
		fi >> sens1[i] >> sens2[i];
		v[sens1[i]].push_back(i);
		v[sens2[i]].push_back(i);
	}
	//verificare existenta ciclu eulerian
	for (int i = 1; i <= n; ++i)
		if (v[i].size()&1)
		{
			fo << -1;
			return 0;
		}
	//alcatuire ciclu eulerian
	stk.push_back(1);
	while (!stk.empty())
	{
		nod = stk.back();
		//scot muchiile folosite
		while (v[nod].size() && bs[v[nod].back()])
			v[nod].pop_back();
		//bag inca un nod in graf
		if (v[nod].size())
		{
			//verific sensul muchiei
			if (nod == sens1[v[nod].back()])
				stk.push_back(sens2[v[nod].back()]);
			else
				stk.push_back(sens1[v[nod].back()]);
			//marchez muchia ca folosita
			bs[v[nod].back()] = 1;
			//sterg muchia din lista nodului;
			v[nod].pop_back();
		}
		//scot nodul din graf si il bag in ciclu
		else
		{
			stk.pop_back();
			rasp.push_back(nod);
		}
	}
	//afisez raspunsul
	rasp.pop_back();//ultimul nod din rasp este chiar nodul din care am pornit
	for (int i = 0; i < rasp.size(); ++i)
		fo << rasp[i] << ' ';
	return 0;
}