Cod sursa(job #515238)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 20 decembrie 2010 20:21:55
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 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 st[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 nod){
	st[++k] = nod;
	while(k){
		int x = st[k];
		if(cnt[x] < (int)G[x].size()){
			int muchie = G[x][cnt[x]];
			if(done[muchie]){
				cnt[x]++;
				continue;
			}
			done[muchie] = 1;
			cnt[x]++;
			st[++k] = other(G[x][cnt[x]-1], x);
		}
		else {
			if(k > 1) printf("%d ",x);
			k--;
		}
	}
}
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();
}