Cod sursa(job #897316)

Utilizator deividFlorentin Dumitru deivid Data 27 februarie 2013 19:57:07
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include<stdio.h>
#include<stack>
#include<vector>

#define maxn 100005
#define maxm 500005

using namespace std;

FILE*f=fopen("ciclueuler.in","r");
FILE*g=fopen("ciclueuler.out","w");

int n,m;
int used[maxm],e,E[maxm],gr[maxn],viz[maxn];
vector< pair<int,int> >G[maxn];
stack<int>st;

void dfs ( int nod ){
	viz[nod] = 1;
	
	for ( vector< pair<int,int> >::iterator itt = G[nod].begin() ; itt != G[nod].end() ; ++itt ){
		int vecin = itt->first;
		
		if ( !viz[vecin] ){
			dfs(vecin);
		}
	}
}

inline bool eulerian () {
	
	for ( int i = 1 ; i <= n ; ++i ){
		if ( gr[i]&1 )	return 0;
	}
	
	for ( int i = 1 ; i <= n ; ++i ){
		if ( gr[i] ){
			dfs(i);
		}
	}
	
	for ( int i = 1 ; i <= n ; ++i ){
		if ( !viz[i] && gr[i] ){
			return 0;
		}
	}
	
	return 1;
}

int main () {
	
	fscanf(f,"%d %d",&n,&m);
	int x,y;
	for ( int i = 1 ; i <= m ; ++i ){
		fscanf(f,"%d %d",&x,&y);
		G[x].push_back(make_pair(y,i)); ++gr[x];
		G[y].push_back(make_pair(x,i)); ++gr[y];
	}
	
	if ( !eulerian() ){
		fprintf(g,"-1\n");
		fclose(f); fclose(g);
		return 0;
	}
	
	st.push(1);
	while ( !st.empty() ){
		int nod = st.top();
		
		if ( G[nod].empty() ){
			E[++e] = nod;
			st.pop();
		}
		else{
			
			if ( !used[ G[nod][G[nod].size()-1].second ] ){
				used[ G[nod][G[nod].size()-1].second ] = 1;
				st.push(G[nod][G[nod].size()-1].first);
			}
			else{
				G[nod].pop_back();
			}
		}
	}
	
	for ( int i = 1 ; i < e ; ++i ){
		fprintf(g,"%d ",E[i]);
	}
	fprintf(g,"\n");
	
	fclose(f);
	fclose(g);
	
	return 0;
}