Cod sursa(job #651734)

Utilizator KoniacDocea Andrei Koniac Data 21 decembrie 2011 11:15:19
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>
#include<vector>
#define lim 100001

using namespace std;

FILE*f=fopen("ciclueuler.in","r");
FILE*g=fopen("ciclueuler.out","w");

int n,m,x,y,ok;
char viz[lim],M[500001];
int d[lim],s[lim];;

vector <pair<int,int> > v[lim];

void dfs(int nod)
{
	viz[nod]=1;
	for(int i=0;i<(int)v[nod].size();++i)
		if(!viz[v[nod][i].first])
			dfs(v[nod][i].first );
}
void eurelian(){
	for(int i=1;i<=n;++i)
		if(d[i]%2||(!viz[i]&&d[i]))
		{
			ok=1;
			break;
		}
}

void euler(){
	int k=0;
	s[++k]=1;
	while(k)
	{
		if(v[s[k]].empty())
		{
			fprintf(g,"%d ",s[k]);
			--k;
		}
		else
		{
			if(M[v[s[k]][v[s[k]].size()-1].second])
				v[s[k]].pop_back();
			else
			{
				s[++k]=v[s[k-1]][v[s[k-1]].size()-1].first;
				M[v[s[k-1]][v[s[k-1]].size()-1].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));
		d[y]++;
		d[x]++;
	}
	dfs(1);
	if(ok)
		fprintf(g,"-1");	
	else{	
		euler();
	}		
	fclose(g);
	fclose(f);
	return 0;
}