Cod sursa(job #2074572)

Utilizator georgianamaximMaxim Georgiana georgianamaxim Data 24 noiembrie 2017 19:40:56
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
#define DN 100001
#define DM 500001
using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

vector <int> v[DN];
stack <int> r,s;
struct vizitat{
bool vz;
int st;
int dr;} viz[DM];
/*
void dfs(int i)
{
    while(v[i].size())
    {
        int a=v[i].back();
        if(viz[a].vz==0)
        {
            viz[a].vz=1;
            v[i].pop_back();
            if(i==viz[a].st)
                dfs(viz[a].dr);
            else dfs(viz[a].st);
        }
        else v[i].pop_back();
    }
    r.push(i);
}
*/
void dfs(int i)
{
    s.push(i);
    while(!s.empty())
    {
        int top=s.top();
        if(v[top].size())
        {
            int a=v[top].back();
            if(viz[a].vz==0)
            {
                viz[a].vz=1;
                v[top].pop_back();
                if(top==viz[a].st)
                    s.push(viz[a].dr);
                else s.push(viz[a].st);
            }
            else v[top].pop_back();
        }
        else
        {
            r.push(top);
            s.pop();
        }
    }
}
int main()
{
    int n,m,a,b;
    bool ok=1;
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        f>>a>>b;
        v[a].push_back(i);
        v[b].push_back(i);
        viz[i].st=a;
        viz[i].dr=b;
    }
    for(int i=1;i<=n;i++)
        if(v[i].size()%2==1)
        {
            ok=0;
            break;
        }
    if(ok==1)
    {
        int e_conex=1;
        dfs(1);
        for(int i=1;i<=n;i++)
            if(v[i].size())
            {
                e_conex=0;
                break;
            }
        if(e_conex==1)
            while(!r.empty())
            {
                g<<r.top()<<" ";
                r.pop();
            }
        else g<<-1;
    }
    else g<<-1;

    return 0;
}