Cod sursa(job #1735095)

Utilizator serbanmaria15Serban Maria-Catalina serbanmaria15 Data 28 iulie 2016 23:34:53
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include<stdio.h>
#include<list>
#include<stack>
#include<queue>
#define NMAX 100001
//nu merge asa pentru ca typeof nu exista in C++
/*#define TRAVERSARE(C, it) for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )*/

std::list<int> adiacenta[NMAX], cicluEulerian;
std::stack<int> stiva;
std::queue<int> coada;

int n, m, vizitat[NMAX], gradNod[NMAX];
FILE *inputFile=fopen("ciclueuler.in","r"), *outputFile=fopen("ciclueuler.out","w");

void bfs(int v)
{
	coada.push(v); vizitat[v]=1;
	while( !coada.empty() )
	{
		v=coada.front(); coada.pop();
		for(std::list<int>::iterator it = adiacenta[v].begin(); it != adiacenta[v].end(); it++)
		{
			int adiacent=*it;
			if(vizitat[adiacent] == 0)
				coada.push(adiacent); vizitat[adiacent]=1; //printf("%d", adiacent);
		}
	}
}

int eConex()
{
	bfs(1);
	for(int v=2; v<=n; v++)
		if(vizitat[v] == 0)
			return 0;
	return 1;
}

int eEulerian()
{
	if(eConex() == 0)
		return 0;
	for(int v=1; v<=n; v++)
		if(gradNod[v]%2 == 1)
			return 0;
	return 1;
}

void stergeMuchie(int v, int w)
{
	gradNod[v]--; gradNod[w]--;
	adiacenta[v].pop_front();
	for(std::list<int>::iterator it = adiacenta[w].begin(); it != adiacenta[w].end(); it++)
		if(*it == v  ) //am gasit un ciclu
		{
		    adiacenta[w].erase(it); //elimin muchia
			break;
		}
}

void reunescCicluri(int v)
{
	while(true)
	{
		if(adiacenta[v].empty())
			break;
		int w=adiacenta[v].front();
		stiva.push(v);
		stergeMuchie(v,w);
		v=w;
	}
}

int rezultat()
{
	int v=eEulerian();
	if(v == 0)
		return -1;
	do{
		reunescCicluri(v);
		v=stiva.top(); stiva.pop();
		cicluEulerian.push_back(v);
	}while( !stiva.empty() );
}

void scrieRezultat(int returnat)
{
	if(returnat == -1)
		fprintf(outputFile, "-1\n");
	else
	{
		for(std::list<int>::iterator it = cicluEulerian.begin(); it != cicluEulerian.end(); it++)
			fprintf(outputFile, "%d ", *it);
		
		fprintf(outputFile, "\n");
	}
}

int main()
{
	int u,v;
	
	fscanf(inputFile, "%d %d", &n, &m);
	for(int i=1; i<=m; i++)
	{
		fscanf(inputFile, "%d %d", &u, &v);
		if(u != v)
		{
			adiacenta[u].push_back(v); gradNod[u]++;
			adiacenta[v].push_back(u); gradNod[v]++;
		}
		else
		{
			adiacenta[u].push_back(u); gradNod[u]+=2;
		}
	}
		/*for(std::list<int>::iterator it = adiacenta[4].begin(); it != adiacenta[4].end(); it++)
			printf("%d", *it);*/

	scrieRezultat(rezultat());

	return 0;
}