Cod sursa(job #339543)

Utilizator razvi9Jurca Razvan razvi9 Data 10 august 2009 11:49:50
Problema Ciclu Eulerian Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<cstdio>
#include<deque>
#include<stack>
#include<vector>

int n,m,i,j,k,g[100001],nr;
std::vector<int> a[100001];
std::vector<int>::iterator it;
std::stack<int> s;


void conex(int v)
{
	++nr;
	g[v] = 1;
	for(int i = 0;i<a[v].size();++i)
		if(!g[a[v][i]])
			conex(a[v][i]);
}

int euler()
{
	for(i=1;i<=n;++i)
		if(g[i]%2) return 0;
	memset(g,0,sizeof(g));
	conex(1);
	return nr == n;
}

void del(int w,int x)
{
	for(it = a[w].begin(); it!=a[w].end(); ++it)
		if(*it == x) break;
	a[w].erase(it);
}

int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(;m;--m)
	{
		scanf("%d %d",&i,&j);
		++g[i];++g[j];
	}
	for(i=1;i<=n;++i)
	{
		a[i].resize(g[i]);
		g[i] = 0;
	}
	fclose(stdin);
	freopen("ciclueuler.in","r",stdin);
	scanf("%d %d",&n,&m);
	for(;m;--m)
	{
		scanf("%d %d",&i,&j);
		a[i][g[i]] = j;
		++g[i];
		a[j][g[j]] = i;
		++g[j];
	}
	if(!euler())
		printf("-1");
	else
	{
		s.push(1);
		nr = 0;
		while(!s.empty())
		{
			if(a[s.top()].size() == 0)
			{
				g[++nr] = s.top();
				s.pop();
			}
			else
			{
				i = s.top();
				j = a[i][0];
				a[i].erase(a[i].begin());
				del(j,i);
				s.push(j);
			}
		}
		for(i=1;i<nr;++i)
			printf("%d ",g[i]);
	}
	fclose(stdout);
	return 0;
}