Cod sursa(job #403014)

Utilizator otilia_sOtilia Stretcu otilia_s Data 24 februarie 2010 14:41:26
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cstdlib>
#include <list>
#include <queue>
#include <stack>
using namespace std;
const int NMAX=100004;
list <int> L[NMAX];
stack <int> S;
int E[NMAX],n,ne,g[NMAX];

void citire()
{
	ifstream fin("ciclueuler.in");
	int m,x,y;
	fin>>n>>m;
	while (m--)
	{
		fin>>x>>y;
		++g[x]; ++g[y];
		L[x].push_back(y); L[y].push_back(x);
	}
	fin.close();
}

void afisare(int sol)
{
	ofstream fout("ciclueuler.out");
	if (!sol) {fout<<"-1\n";}
		else
		{
			for (int i=1;i<=ne;++i)
				fout<<E[i]<<" ";			
		}	
	fout.close();
}

bool verif_eulerian()
{ int i;
	for (i=1;i<=n;++i) 
		if (g[i]%2) return 0;
	queue<int> Q; bool viz[NMAX]; int nrl;
	memset(viz,0,sizeof(viz));
	viz[1]=1; Q.push(1); nrl=1;
	while (!Q.empty())
	{
		int x=Q.front(); Q.pop();		
		typeof(L[x].begin()) it;
		for (it=L[x].begin(); it!=L[x].end();++it)
		 if (!viz[*it]) { viz[*it]=1; Q.push(*it); ++nrl;}
	}		
	if (nrl<n) return 0;
	return 1;
}

void sterge(int v, int w)
{
	L[v].pop_front(); g[v]--;
	typeof(L[w].begin()) it;
	for (it=L[w].begin(); it!=L[w].end();++it)
	 if (*it==v)
		{
			L[w].erase(it);
			g[w]--;
			break;
		}
}

void euler(int v)
{ int w;
	while (g[v])
	{
		w=L[v].front(); 
		S.push(v);
		sterge(v,w);
		v=w;
	}
}

void rez()
{
	int v=1; ne=0;
	do
	{
	  euler(v);
	  v=S.top();   S.pop();
	  E[++ne]=v;
	}
	while (!S.empty());
}

int main()
{
	citire();
	if (!verif_eulerian()) afisare(0);
	rez();
	afisare(1);
	return 0;
}