Cod sursa(job #765758)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 9 iulie 2012 10:52:49
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
struct nod {
	int y,m;
	inline nod(int _y, int _m) {
		y=_y;
		m=_m;
	}
};
struct stiva {
	int x;
	vector <nod> :: iterator it;
};
vector <nod> v[100001];
int gr[100001],s[500001];
bitset <500001> d;
stiva st[500001];
inline void dfs(int x)
{
	int l,aux;
	vector <nod> :: iterator it;
	l=1;
	st[1].x=x;
	st[1].it=v[x].begin();
	while(l>=1) {
		aux=l;
		for(it=st[l].it;it!=v[st[l].x].end();it++) 
			if(d[it->m]==0) {
				d[it->m]=1;
				s[l]=st[l].x;
				st[l].it=it;
				l++;
				st[l].x=it->y;
				st[l].it=v[it->y].begin();
				break;
			}
		if(aux==l) {
			l--;
			if(l)
				printf("%d ",s[l]);
		}
	}
}
#define DIM 30000
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
	numar=0;
	while(buff[poz] <'0'||buff[poz]>'9')     
		if(++poz==DIM) {
			fread(buff,1,DIM,stdin);
			poz=0;
		}
	while('0'<=buff[poz]&&buff[poz]<='9') {
		numar=numar*10+buff[poz]-48;
		if(++poz==DIM) {
			fread(buff,1,DIM,stdin);
			poz=0; 
		}			
	}     
}
int main ()
{
	int n,m,i,x,y,c;
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	citeste(n);
	citeste(m);
	for(i=1;i<=m;i++) {
		citeste(x);
		citeste(y);
		v[x].push_back(nod(y,i));
		v[y].push_back(nod(x,i));
		gr[x]++;
		gr[y]++;
	}
	fclose(stdin);
	c=1;
	for(i=1;i<=n;i++)
		if(gr[i]%2==1) {
			c=0;
			break;
		}
	if(c==0) 
		printf("-1");
	else dfs(1);
	fclose(stdout);
	return 0;
}