Cod sursa(job #773581)

Utilizator legionarulCorneliu Zelea Codreanu legionarul Data 2 august 2012 07:58:38
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
 # include <fstream>
 # include <cstring>
 # include <algorithm>
 # include <vector>
 # include <stack>
 
 # define pb push_back
 # define dim 500005
 
 using namespace std;
 
 ifstream f("ciclueuler.in");
 ofstream g("ciclueuler.out");
 
 struct euler
 {
	 int nod, poz;
 };
 
 stack < euler > q;
 vector < euler > a[ dim ];
 bool viz[ dim ];
 
 int n, m;
 
 void citire()
 {
	 int i, j, x, y;
	 
	 f >> n >> m;
	 for ( i = 1 ; i <= m ; i++ )
	 {
		 f >> x >> y;
		 
		 a[ x ].pb( ( euler ) { y, i } );
		 a[ y ].pb( ( euler ) { x, i } );
		 
	 }
	 
	 /*
	 for ( i = 1 ; i <= n ; i++ )
	 {
		 for ( j = 0 ; j < a[ i ].size(); j++ )
			 g << a[ i ][ j ].nod << " ";
		 g << "\n";
	 }
	 g << "\n";
	 for ( i = 1 ; i <= n ; i++ )
	 {
		 for ( j = 0 ; j < a[ i ].size(); j++ )
			 g << a[ i ][ j ].poz << " ";
		 g << "\n";
	 }
	 g << "\n";
	 */
	 
 }
 
 inline void df( int x )
 {
	 int i ;
	 euler var;
	
	 
	q.push( ( euler ) { x, 0 } );
	
	while( !q.empty() )
	{
		var = q.top();
		//g << var.nod << " " << var.poz << "\n";
		for ( i = var.poz ; i < a[ var.nod ].size() ; i++ )
			if ( viz[ a[ var.nod ][ i ].poz ] == 0 )
			{
				viz[ a[ var.nod ][ i ].poz ] = 1;
				
				q.pop();
				q.push( ( euler ) { var.nod , i } );
				
				
				q.push( ( euler ) { a[ var.nod ][ i ].nod, 0 } );
				break;
			}
		
		if ( i == a[ var.nod ].size() )
		{
			var = q.top();
			g << var.nod << " ";
			q.pop();
			
		}
	}
	
	 
	 /*
	 for ( i = 0 ; i < a[ x ].size() ; i++ )
		 if ( viz[ a[ x ][ i ].poz ] == 0 )
		 {
			 viz[ a[ x ][ i ].poz ] = 1;
			 df( a[ x ][ i ].nod );
		 }
		 g << x << " ";
	 */
 }
 
 int main()
 {
	 int i;
	 
	 citire();
	 
	 for ( i = 1 ; i <= n ; i++ )
		 if( a[ i ].size() % 2 != 0 )
		 {
			 g << "-1";
			 return 0;
		 }
		 
	 df( 1 );
	 return 0;
 }