Cod sursa(job #2544183)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 11 februarie 2020 20:33:08
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <fstream>
#include <vector>

#define pb push_back

const int MAXN = 100000;
const int MAXM = 500000;

using namespace std;

ifstream cin( "ciclueuler.in" );
ofstream cout( "ciclueuler.out" );

int n, m;

vector<int> g[MAXN+1];
vector<int> q;
vector<int> sol;

bool viz[MAXM+1];

int from[MAXM+1];
int to[MAXM+1];

int legitcheck( )
{
  for( int i=1;i<=n;i++ )
    if( g[i].size()%2 )
      return 0;

  return 1;
}

int main()
{
  cin>>n>>m;

  for( int i=1;i<=m;i++ )
  {
    int x, y; cin>>x>>y;

    g[x].pb(i);
    g[y].pb(i);

    from[i]=x;
    to[i]=y;
  }

  if( legitcheck() )
  {
    q.pb(1);

    while( !q.empty() )
    {
      int node=q.back();

      if( !g[node].empty() )
      {
        int edge=g[node].back(); g[node].pop_back();

        if( !viz[edge] )
        {
          viz[edge]=true;

          int nextnode=from[edge]^to[edge]^node;

          q.pb(nextnode);
        }
      }
      else
      {
        q.pop_back();
        sol.pb(node);
      }
    }

    int ans=sol.size();

    for( int i=0;i<ans-1;i++ )
      cout<<sol[i]<<" ";
  }
  else
    cout<<"-1";

  return 0;
}