Cod sursa(job #2432913)

Utilizator MortemPlaiasu Iulia-Silvia Mortem Data 25 iunie 2019 14:23:40
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <stack>
std::ifstream fin("ciclueuler.in");
std::ofstream fout("ciclueuler.out");

struct edge
{
  int dest, ind;
};

std::list<edge> v[100500];
std::list<edge>::iterator t[100500];
bool hasEdge[500500];
int n,m;
std::stack<int> s;
int grad[100500];
std::vector<int> rez;
int main()
{
  fin>>n>>m;
  for(int i=0;i<m;i++)
  {
    int j,k;
    fin>>j>>k;
    v[j].push_back({k,i});
    grad[j]++;
    grad[k]++;
    if(j!=k)
      v[k].push_back({j,i});
    hasEdge[i]=true;
  }
  for(int i=1;i<=n;i++)
  {
    t[i]=v[i].begin();
    if(grad[i]%2!=0)
    {
      fout<<"-1\n";
      return 0;
    }
  }
  s.push(1);
  while(!s.empty())
  {
    int tp = s.top();
    std::list<edge>::iterator it=t[tp];
    for(; it!= v[tp].end();)
    {
      t[tp]=it;
      if(t[tp]!= v[tp].end())
        t[tp]++;
      if(!hasEdge[it->ind])
      {
        ++it;
        continue;
      }
      s.push(it->dest);
      hasEdge[it->ind]=false;
      break;
    }
    if(t[s.top()]== v[s.top()].end())
    {
      rez.push_back(s.top());
      s.pop();
    }
  }
  for(int i=0;i<rez.size()-1;i++)
    fout<<rez[i]<<" ";
}