Cod sursa(job #373297)

Utilizator savimSerban Andrei Stan savim Data 13 decembrie 2009 13:19:45
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define MAX_N 100010
#define MAX_M 500010

int n, m, t;
int ind[MAX_N], L[MAX_N], grad[MAX_N];
int use[MAX_M], Q[MAX_M], Sol[MAX_M];

struct muchie {
	int p, q;
} v[MAX_M];

vector <int> edge[MAX_N];

void cit() {
	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].p, &v[i].q);
		edge[v[i].p].push_back(i); 
		edge[v[i].q].push_back(i);

		L[v[i].p]++; L[v[i].q]++;
		grad[v[i].p]++; grad[v[i].q]++;
	}
}

void solve() {
	for (int i = 1; i <= n; i++)
		if (grad[i] % 2) {
        	printf("-1");
			return;
		}

	Q[1] = t = 1;
	while (t) {
		int nod = Q[t];

    	for (; ind[nod] < L[nod]; ind[nod]++)
			if (use[edge[nod][ind[nod]]] == 0) {
            	use[edge[nod][ind[nod]]] = 1;

				int e = edge[nod][ind[nod]];
				if (v[e].p == nod) Q[++t] = v[e].q;
				else Q[++t] = v[e].p;
				
				break;
			}

		if (ind[nod] == L[nod])
			Sol[++Sol[0]] = Q[t--];
	}
}

void write() {
	for (int i = 1; i < Sol[0]; i++)
		printf("%d ", Sol[i]);
	printf("\n");
}

int main() {

	cit();
	solve();
	write();

	return 0;
}