Cod sursa(job #493980)

Utilizator klamathixMihai Calancea klamathix Data 20 octombrie 2010 12:02:32
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include<cstdio>
#include<vector>
#define f first
#define s second
const int maxn = 100005;
const int maxm = 500005;
using namespace std;

vector <pair <int , int > > G[maxn];
int i , j , n , m , a , b , e , dg[maxn] , sol[maxm];
bool seen[maxn] ;
int tip[maxm];

void DFS(int node)
{
	int i;
	seen[node] = 1;
	for( i = 0 ; i < G[node].size() ; ++i) {
		if ( seen[G[node][i].f] ) {
			if( tip[G[node][i].s] == 0)
				tip[G[node][i].s] = 1;
		}
		else {
			tip[G[node][i].s] = 2 ;
			DFS( G[node][i].f );
		}
	}
}
			

void sterge_muchie ( int nod , int ind ) {
	int i , nod2 = G[nod][ind].f , m = G[nod][ind].s;
	G[nod].erase(G[nod].begin() + ind);
	for ( i = 0 ; i < G[nod2].size() ;++i)
		if ( G[nod2][i].s == m ) {
			G[nod2].erase( G[nod2].begin() + i);
			return;
		}
}

void Euler()
{
	int i , v = 1;
	for( i = 1 ; i <= n ; ++i )
		if ( dg[i] & 1 ) {
			printf("-1\n");
			return;
		}
	
	while ( e < m ) { 
		bool ok = 0;
		for( i = 0 ; i < G[v].size() ; ++i ) {
			if ( tip[G[v][i].s] == 1 ) {
				ok = true;
				int aux = G[v][i].f;
				sterge_muchie(v , i);
				v = aux;
				break;
				}
			}
		
			if ( !ok && !G[v].empty() ) {
				int aux = G[v][0].f;
				sterge_muchie(v, 0);
				v = aux;
			}
			++e;
			printf("%d ",v);
	}
}

int main()
{
	freopen("ciclueuler.in","r",stdin);
	freopen("ciclueuler.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	for( i = 1 ; i <= m ; ++i  ){
		scanf("%d %d",&a,&b);
		G[a].push_back(make_pair( b , i ));
		G[b].push_back(make_pair( a,  i ));
		dg[a] ++ , dg[b] ++;
	}
	DFS(1);
	
	//for( i = 1 ; i <= m ; ++i )
	//	printf("%d\n",tip[i]);
	
	Euler();
	
return 0;	
}