Cod sursa(job #2073081)

Utilizator BogdanNeghinaNeghina Bogdan BogdanNeghina Data 22 noiembrie 2017 18:13:01
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream cin("ciclueuler.in");
ofstream cout("ciclueuler.out");
struct nod{
    int x,nrmuchie;
};
vector <nod> v[1000001];
stack <int> stiva;
int n,m,x,y,viz[100001],sol[500005],k;
bool muchie[500005];
void dfs (int x)
{
    viz[x]=1;
    for(int i=0;i<v[x].size();i++)
    {
        int y=v[x][i].x;
        if(viz[y]==0)
            dfs(y);
    }
}
void ciclueulerian(int x)
{
    stiva.push(x);
    while(!stiva.empty())
    {
        x=stiva.top();
        while(v[x].size()>0 && muchie[v[x].back().nrmuchie]==1)
        {
            v[x].pop_back();
        }
        if(v[x].size()>0)
        {
            y=v[x].back().x;
            stiva.push(y);
            muchie[v[x].back().nrmuchie]=1;
        }
        else
        {
            sol[++k]=x;
            stiva.pop();
        }
    }
}
int main ()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>x>>y;
        v[x].push_back({y,i});
        v[y].push_back({x,i});
    }
    dfs(1);
    for(int i=1;i<=n;i++)
    {
        if(v[i].size()%2==1||viz[i]==0)
        {
            cout<<-1;
            return 0;
        }
    }
    ciclueulerian(1);
    for(int i=1;i<k;i++)
        cout<<sol[i]<<" ";
    return 0;
}