Cod sursa(job #690541)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 25 februarie 2012 18:37:05
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<fstream>
#include<bitset>
#include<vector>
#define dim 500002
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int n,m,Grad[dim],i,x,y,vc,V[dim];
vector<pair <int,int>  >L[dim];
bool False;
bitset<dim>Mark;
bitset<dim>viz;
void euler(int nod){
	int nd;
	int k=0;
	V[++k]=nod;
	for(; k;){
		if(L[V[k]].size()==0){
			fout<<V[k]<<" ";
			--k;
			continue;
		}
			if(Mark[  L[V[k]][L[V[k]].size()-1].second]==1){
				
				L[V[k]].pop_back();
			}
			else{
				++k;
				V[k]=L[V[k-1]][L[V[k-1]].size()-1].first;
				Mark[  L[V[k-1]][L[V[k-1]].size()-1].second]=1;
			}
	}
}
void dfs(int nod){
	viz[nod]=1;
	for(int i=0;i<L[nod].size();++i)
		if(!viz[L[nod][i].first])
			dfs(L[nod][i].first);
}
int main (){
	fin>>n>>m;
	for(i=1;i<=m;i++){
		fin>>x>>y;
		
		L[x].push_back(make_pair(y,i));
		L[y].push_back(make_pair(x,i));
		
		Grad[x]++;
		Grad[y]++;
	}
	dfs(1);
	
	False=0;
	for(i=1;i<=n;i++)
		if(Grad[x]%2 || !viz[x] )
			False=1;
	
	if(!False)
		euler(1);
	else
		fout<<"-1\n";
	
	
	return 0;
}