Pagini recente » Cod sursa (job #2294458) | Cod sursa (job #646311) | Cod sursa (job #3259892) | Cod sursa (job #845237) | Cod sursa (job #1123681)
#include <cstdio>
#include <vector>
#include <stack>
#define SIZE 100003
using namespace std;
int n, m, degree[SIZE];
bool visited[SIZE], not_eulerian;
vector < int > adj[SIZE], sol;
stack < int > st;
inline void read();
inline void solve();
inline void write();
int main()
{
read();
solve();
write();
return 0;
}
inline void read()
{
freopen("ciclueuler.in", "r", stdin);
scanf("%d%d", &n, &m);
while( m-- )
{
int x, y;
scanf("%d%d", &x, &y);
adj[ x ].push_back( y );
adj[ y ].push_back( x );
++degree[ x ];
++degree[ y ];
}
}
inline void DFS( int node )
{
visited[ node ] = 1;
for(vector <int> :: iterator it = adj[node].begin(); it != adj[node].end(); ++it)
if( !visited[ *it ] )
DFS( *it );
}
inline bool is_connected()
{
DFS( 1 );
for(int i = 1; i <= n; ++i)
if( !visited[ i ] )
return 0;
return 1;
}
inline bool is_eulerian()
{
if( ! is_connected() )
return 0;
for(int i = 1; i <= n; ++i)
if( degree[i] % 2 )
return 0;
return 1;
}
inline void del_edge( int node1, int node2 )
{
adj[node1].erase( adj[node1].begin() );
for(vector <int> :: iterator it = adj[node2].begin(); it != adj[node2].end(); ++it)
if( (*it) == node1 )
{
adj[ node2 ].erase( it );
return;
}
}
inline void euler( int node )
{
while( true )
{
if( adj[node].empty() )
return ;
st.push( node );
int node2 = adj[node].front();
del_edge( node, node2 );
node = node2;
}
}
inline void solve()
{
if( ! is_eulerian() )
{
not_eulerian = 1;
return ;
}
int node = 1;
do
{
euler( node );
node = st.top();
st.pop();
sol.push_back( node );
} while ( ! st.empty() );
}
inline void write()
{
freopen("ciclueuler.out", "w", stdout);
if( not_eulerian )
printf("-1\n");
else
{
for( vector <int> :: iterator it = sol.begin(); it != sol.end(); ++it)
printf("%d ", *it);
printf("\n");
}
}