Cod sursa(job #2034202)

Utilizator Juve45UAIC Alexandru Ionita Juve45 Data 7 octombrie 2017 16:32:10
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define DMAX 100005
using namespace std;
 
int a, b, n, m;
int use[DMAX];
vector <int> v[DMAX];
 
void DFS(int x)
{
    for(int i=0;i<v[x].size();i++)
        if(!use[v[x][i]])
            {
            use[v[x][i]]=1;
            DFS(v[x][i]);
        }
}
 
bool valid()
{
DFS(1);
for(int i=1;i<=n;i++)
    if(use[i]==0 || v[i].size()%2==1)
        return false;
return true;
 
}
 
void erase_edge(int a, int b)
{
    v[a].erase(v[a].begin());
    for(int i=0;i<v[b].size();i++)
    if(v[b][i]==a) {
            v[b].erase(v[b].begin()+i);
            return;
    }
}
 
void euler()
{
    stack <int> s;
 
    s.push(1);
 
    while(!s.empty())
    {
        int x=s.top();
 
        if(v[x].size())
        {
            s.push(v[x][0]);
            erase_edge(x, v[x][0]);
        }
        else{
                if(s.size()!=1)
                cout<<x<<" ";
            s.pop();
        }
    }
    cout<<'\n';
}
 
int main()
{
 
   freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
 
    scanf("%i %i", &n, &m);
 
    for(int i=1;i<=m;i++){
 
        scanf("%i %i", &a, &b);
        v[a].push_back(b);
        v[b].push_back(a);
    }
 
    if(valid())
        euler();
    else cout<<"-1\n";
 
    return 0;
}