Cod sursa(job #751076)

Utilizator deividFlorentin Dumitru deivid Data 24 mai 2012 09:15:50
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<stdio.h>
#include<vector>
#define dim1 500001
#define dim2 100001
using namespace std;
FILE*f=fopen("ciclueuler.in","r");
FILE*g=fopen("ciclueuler.out","w");
int stv[dim1],n,m,r[dim2],x,y;
char viz[dim1];
vector <pair<int,int> > v[dim2],aux;
void dfs(int nod)
{
	viz[nod]=1;
	for(int i=0;i<v[nod].size();++i)
		if(!viz[v[nod][i].first])
			dfs(v[nod][i].first);
}
void euler()
{
	int k=1;
	stv[1]=1;
	aux.push_back (make_pair(0,0));
	while(k)
	{
		if(v[stv[k]].empty())
			fprintf(g,"%d ",stv[k--]);
		else
		{
			aux[0]=v[stv[k]][v[stv[k]].size()-1];
			if(viz[aux[0].second])
				v[stv[k]].pop_back();
			else
			{
				stv[++k]=aux[0].first;
				viz[aux[0].second]=1;
			}
		}
		
	}
	
	
	
}
int main()
{
	fscanf(f,"%d%d",&n,&m);
	for(int i=1;i<=m;++i)
	{
		fscanf(f,"%d%d",&x,&y);
		v[x].push_back (make_pair(y,i));
		v[y].push_back (make_pair(x,i));
		++r[x];
		++r[y];
	}
	
	dfs(1);
	
	int ok=0;
	for(int i=1;i<=n;++i)
		if(r[i]%2||(!viz[i]&&r[i]))
		{
			ok=1;
			break;
		}
	
	if(ok)
		fprintf(g,"-1");
	else
	{
		for(int i=1;i<=n;++i)
			viz[i]=0;
		euler();
	}
	fclose(g);
	fclose(f);
	return 0;
}