Cod sursa(job #515236)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 20 decembrie 2010 20:14:49
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include <vector>
using namespace std;
#define NMAX 100010
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
#define MMAX 500010
struct xy{
	int x,y;};

vector<int> G[NMAX];
xy v[MMAX];
bool done[MMAX];
int grad[NMAX], cnt[NMAX];
int viz[NMAX];
int n, m, k;
inline int other(int m, int x){
	return v[m].x + v[m].y - x;
}
void dfs(int x){
	viz[x] = 1;
	FOR(i, G[x])
		if(!viz[other(*i, x)]) 
			dfs(other(*i, x));
}
int check_eulerian() {
	for(int i = 1; i <= n; ++i)
		if(grad[i] % 2) return 1;
	dfs(1);
	for(int i = 1; i <= n; ++i)
		if(!viz[i]) return 1;
	return 0;
}
void euler(int x){
	while(cnt[x] < (int)G[x].size()){
		int muchie = G[x][cnt[x]];
		if(done[muchie]){
			cnt[x]++;
			continue;
		}
		done[muchie] = 1;
		cnt[x]++;
		k++;
		euler(other(G[x][cnt[x]-1], x));
		k--;
	}
	if(k) printf("%d ",x);
}
void build_sol(){
	euler(1);
}
int main(){
	freopen("ciclueuler.in", "r", stdin);
	freopen("ciclueuler.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= m; ++i){
		scanf("%d%d", &v[i].x, &v[i].y);
		grad[v[i].x]++; grad[v[i].y]++;
		G[v[i].x].push_back(i);
		G[v[i].y].push_back(i);
	}
	if(check_eulerian()){
		printf("-1\n");
		return 0;
	}
	build_sol();
}