Cod sursa(job #557588)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 16 martie 2011 18:37:04
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <algorithm>
#include <fstream>
#include <vector>
#include <stack>
#define Nmax 500010
using namespace std;

stack <int> c; //stiva cu noduri
int ce[Nmax]; //solutia
vector<int> a[100001];
int nr,k;

void ciclu(int x)
{	int nr=x,z; //salvam nodul de start

	do{		if(a[x].size()){ //daca nodul are vecin
		    c.push(a[x][0]); //adaugam nodul in stiva pentru  (incercam sa formam un nou ciclu din el)							
			z = a[x][0];				
			a[z].erase(find(a[z].begin(), a[z].end(), x)); //stergem muchia de la z la x
			a[x].erase(a[x].begin()); //stergem muchia de la x la z
			x = z; //ne mutam in nodul z
		    }
					
	} while (x!=nr); //cat timp nu am ajuns in nodul de inceput (!ciclu)
	
	ce[++k]=nr; //adaugam nodul curent la solutie
	
	c.pop(); //stergem nodul curent din stiva
}

int main(){	
	
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	
	
	int N, M;
	scanf("%d%d",&N,&M);
	
	for (int i = 1; i <= M; i++)
	{	int x, y;
		scanf("%d%d",&x,&y);		
		a[x].push_back(y),a[y].push_back(x);
	}	
	
	for (int i = 1; i <= N; i++)
		if (a[i].size() % 2) //daca un nod are gr impar
			{printf("-1"); return 0;} //nu este eulerian
		
	c.push(1),k=0;
	
	do	
			if (a[c.top()].size() > 0)	//daca nodul curent are muchii nefolosite
				ciclu(c.top()); //putem forma un nou ciclu
			else	ce[++k]=c.top(),c.pop(); //altfel adaugam nodul curent la sol, trecem la nod anterior
			
	while (c.size()!=1);
			
	if(k!=M) //daca nu am folosit toate muchiile
		{printf("-1"); return 0;} //nu este eulerian
		
	for (int i = 1; i <= k; i++) //afisam nodurile din ciclu
		printf("%d ",ce[i]);
return 0;
}