Pagini recente » Cod sursa (job #2367983) | Cod sursa (job #1310727) | Cod sursa (job #1615413) | Cod sursa (job #1868462) | Cod sursa (job #594354)
Cod sursa(job #594354)
#include <fstream>
#include <vector>
#include <stack>
#include <cstring>
#define pb push_back
#define NMAX 100005
#define MMAX 500005
using namespace std;
ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
vector< int > Muchii[NMAX], Sol;
stack< int > Noduri;
int Nod1[MMAX], Nod2[MMAX], i, N, M, Pos[NMAX], Nod;
bool Scoate, USEDM[MMAX];
int main()
{
in >> N >> M;
for( i = 1; i <= M; i++ )
{
in >> Nod1[i] >> Nod2[i];
Muchii[ Nod1[i] ].pb( i );
Muchii[ Nod2[i] ].pb( i );
}
for( i = 1; i <= N; i++ )
if( Muchii[i].size()%2 )
{
printf("-1\n");
return 0;
}
memset( Pos, 0, sizeof(Pos) );
memset( USEDM, false, sizeof(USEDM) );
Noduri.push( 1 );
while( !Noduri.empty() )
{
Scoate = false;
Nod = Noduri.top();
for( i = Pos[Nod]; i < (int)Muchii[Nod].size(); i++ )
if( !USEDM[ Muchii[Nod][i] ] )
{
USEDM[ Muchii[Nod][i] ] = true;
( Nod == Nod1[ Muchii[Nod][i] ] ) ? Noduri.push( Nod2[ Muchii[Nod][i] ] ) : Noduri.push( Nod1[ Muchii[Nod][i] ] );
Pos[Nod] = i+1;
Scoate = true;
break;
}
if( !Scoate )
{
Sol.pb( Noduri.top() );
Noduri.pop();
}
}
for( i = 1; i < (int)Sol.size(); i++ )
out << Sol[i] << ' ';
out << '\n';
return 0;
}