Cod sursa(job #2928495)

Utilizator albertaizicAizic Albert albertaizic Data 23 octombrie 2022 01:33:33
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
#include <stack>
using namespace std;
#define MAX_N 100001
#define MAX_M 500001

vector<pair <int,int>> edge[MAX_N];
bool del[MAX_M];
int nrs[MAX_N];
stack<int> cycle;
FILE *fin,*fout;

pair<int,int> Edge(int node){
  return edge[node].back();
}

void eraseEdge(int node,int nr,int i){
  del[i]=true;
  nrs[node]--;
  nrs[nr]--;
}

void euler(int node){
  pair<int,int> nr;
  int c;
  c=nrs[node]/2;
  cycle.push(node);
  while(!cycle.empty()){
    node=cycle.top();
    if(nrs[node]!=0){
      nr=Edge(node);
      edge[node].pop_back();

      if(del[nr.second]==false){
        cycle.push(nr.first);
        eraseEdge(node,nr.first,nr.second);
      }
    }else{
      if(node==1){
        if(c>0)
          fprintf(fout, "%d ",node);
        c--;
      }else{
        fprintf(fout, "%d ",node);
      }
      cycle.pop();
    }
  }

}
int main(){

    int n,m,i,a,b,s=1;
    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,&b);
      edge[a].push_back({b,i});
      edge[b].push_back({a,i});
      nrs[a]++;
      nrs[b]++;
    }

    for(i=0;i<n;i++){
      if(nrs[i]%2==1){
        s=0;
      }
    }

    if(s==0){
      fprintf(fout,"-1\n");
    }else{
      euler(1);
    }
    fclose(fin);
    fclose(fout);
    return 0;
}