Cod sursa(job #2927931)

Utilizator Mihai.MocanuMihai mmm Mihai.Mocanu Data 21 octombrie 2022 21:07:41
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <stack>
#define MAXN 100005
using namespace std;
FILE *fin,*fout;

struct XY{
  int x,y;
};

vector <int> g[MAXN];
stack <int> q;
int ne[MAXN];

void AddEdge(XY a){
  g[a.x].push_back(a.y);
  g[a.y].push_back(a.x);
  ne[a.x]++;
  ne[a.y]++;
}

void Euler(int x){
  int neigh,c,c2;
  q.push(x);
  c2=ne[x]/2;
  while(!q.empty()){
    x=q.top();
    if(ne[x]!=0){
      neigh=g[x].front();
      q.push(neigh);
      g[x].erase(g[x].begin());
      c=0;
      for(int y : g[neigh]){
        if(y==x){
          g[neigh].erase(g[neigh].begin()+c);
          break;
        }
        c++;
      }
      ne[x]--;
      ne[neigh]--;
    }else{
      if(x==1){
        if(c2>0){
          fprintf(fout,"%d ",x);
          c2--;
        }
      }else{
        fprintf(fout,"%d ",x);
      }
      q.pop();
    }
  }
}


int main(){
  int n,m,s,i;
  XY a;
  fin=fopen("ciclueuler.in","r");
  fout=fopen("ciclueuler.out","w");
  fscanf(fin,"%d%d",&n,&m);

  for(i=0;i<m;i++){
    fscanf(fin,"%d%d",&a.x,&a.y);
    AddEdge(a);
  }
  s=1;
  for(i=0;i<n;i++){
    if(ne[i]%2==1){
      s=0;
    }
  }
  if(s==0){
    fprintf(fout,"-1\n");
  }else{
    Euler(1);
  }

  fclose(fin);
  fclose(fout);
  return 0;
}