Cod sursa(job #373139)

Utilizator savimSerban Andrei Stan savim Data 12 decembrie 2009 19:19:49
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define MAX_N 100010
#define MAX_M 500010

#define pb push_back

vector <int> v[MAX_N], poz[MAX_N];
int n, m, p, q, t;
int len[MAX_N], L[MAX_N];
int ind[MAX_M], DFS[MAX_N], Q[MAX_M];

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", &p, &q);
		v[p].pb(q); v[q].pb(p);
		poz[p].pb(i); poz[q].pb(i);

		L[p]++; L[q]++;
	}
}

void solve() {
	t = 1; DFS[1] = 1;

	while (t) {
		int nod = DFS[t];
		for (; len[nod] < L[nod]; len[nod]++)
			if (ind[poz[nod][len[nod]]] == 0) {
    	    	ind[poz[nod][len[nod]]] = 1;
				DFS[++t] = v[nod][len[nod]];
				break;
			}

		if (len[nod] == L[nod])
			Q[++Q[0]] = DFS[t--];
	}
}

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

int main() {

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

	return 0;
}