Pagini recente » Cod sursa (job #2382350) | Cod sursa (job #3186319) | Cod sursa (job #2920881) | Cod sursa (job #1352291) | Cod sursa (job #2928495)
#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;
}