Cod sursa(job #2165593)

Utilizator Alex_AmarandeiAmarandei Matei Alexandru Alex_Amarandei Data 13 martie 2018 12:47:49
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

struct node
{
	int x;
	node* next;
};

typedef node* LSI;

LSI l1[100005];
int n, m;
vector <int> cycle;
vector <int> stk;

void read();
void insert(LSI& l, int x);
void euler(int nod);
void euler_iterative(int nod);
void delete_edge(int v, int w, node* q);
void write();

int main()
{
	read();
	euler_iterative(1);
	//write();

	return 0;
}

void read()
{
	int i, x, y;

	fin >> n >> m;

	for (i = 1; i <= m; i++)
	{
		fin >> x >> y;
		insert(l1[x], y);
		insert(l1[y], x);
	}
}

void insert(LSI& l, int x)
{
	node* p = new node;
	p->x = x; p->next = l;
	l = p;
}

void euler_iterative(int nod)
{
	/*int w;
	node *p, *q = new node;
	cycle.push_back(nod); fout << nod << ' ';

	while (!cycle.empty())
	{
		nod = cycle.back();
		for (p = l1[nod], q->next = p; p && l1[nod]; q = q->next)
		{
			w = p->x; p = p->next; cycle.push_back(w); fout << w << ' ';
			delete_edge(nod, w, q);
			break;
		}
		if (l1[nod] == NULL)
			cycle.pop_back();
	}

	fout << nod << '\n';*/ fout << 1 << '\n';
}

void euler(int nod)
{
	node* p, *q = new node;
	int w;

	for (p = l1[nod], q->next = p; p && l1[nod]; q = q->next)
	{
		w = p->x; p = p->next;
		delete_edge(nod, w, q);
		euler(w);
	}

	cycle.push_back(nod);
}

void delete_edge(int v, int w, node* q)
{
	node* p;

	p = q->next;
	q->next = p->next;
	delete p; l1[v] = q->next;

	p = l1[w];
	if (p->x == v)
	{
		q = p->next;
		delete p; l1[w] = q;
	}
	else
	{
		for (; p->next->x != v; p = p->next);

		q = p->next;
		p->next = q->next;
		delete q;
	}
}

void write()
{
	for (int i = 1; i <= n; i++)
		if (l1[i])
		{
			fout << -1 << '\n';
			return;
		}

	while (!cycle.empty())
	{
		fout << cycle.back() << ' '; cycle.pop_back();
	}
	fout << '\n';
}