Cod sursa(job #269124)

Utilizator scvalexAlexandru Scvortov scvalex Data 2 martie 2009 15:13:03
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <cstdio>
#include <vector>

using namespace std;

typedef struct {
	int x, y;
} Edge;

Edge E[500000];
bool used[500000];
vector<int> G[100001];
int k[100001];
int C[500001];
int NC;
int S[500001];

void cicluri(int u) {
	while (true) {
		for (; (k[u] < (int)G[u].size()) && used[G[u][k[u]]]; ++k[u])
			;
		if (k[u] >= (int)G[u].size())
			break;
		used[G[u][k[u]]] = true;
		if (E[G[u][k[u]]].x == u)
			cicluri(E[G[u][k[u]]].y);
		else
			cicluri(E[G[u][k[u]]].x);
	}
	C[NC++] = u;
	//printf("%d ", u);
}

void cicluri2(int u) {
	int se = 0;
	S[se++] = u;
	while (se > 0) {
		u = S[se-1];

		for (; (k[u] < (int)G[u].size()) && used[G[u][k[u]]]; ++k[u])
			;

		if (k[u] >= (int)G[u].size()) {
			C[NC++] = u;
			--se;
			continue;
		}

		used[G[u][k[u]]] = true;
		if (E[G[u][k[u]]].x == u)
			S[se++] = E[G[u][k[u]]].y;
		else
			S[se++] = E[G[u][k[u]]].x;
	}
}

int main(int argc, char *argv[]) {
	int N, M, i;

	FILE *fi = fopen("ciclueuler.in", "r");
	fscanf(fi, "%d %d", &N, &M);
	for (i = 0; i < M; ++i) {
		fscanf(fi, "%d %d", &E[i].x, &E[i].y);
		G[E[i].x].push_back(i);
		G[E[i].y].push_back(i);
	}
	fclose(fi);

	/*for (i = 0; i < M; ++i)
		printf("%d - %d\n", E[i].x, E[i].y);
	printf("\n");*/


	cicluri2(1);
	//printf("\n");
	
	FILE *fo = fopen("ciclueuler.out", "w");
	if (NC != M+1) {
		fprintf(fo, "-1\n");
	} else {
		for (i = 0; i < NC; ++i)
			fprintf(fo, "%d ", C[i]);
		fprintf(fo, "\n");
	}
	fclose(fo);

	return 0;
}