Cod sursa(job #1793178)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 30 octombrie 2016 20:11:11
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

struct Muchie
{
    int a, b;
    bool viz;
    inline int other(int c)
    {
        return a == c ? b : a;
    }
} mc[500005];

int gr[100005] = {0};
vector<int> v[100005];
int n, m;
vector<int> r, st;
bool viz[100005] = {0};

void dfs(int i)
{
    if(viz[i] == true)
        return;
    viz[i] = true;
    for(int j = 0; j < v[i].size(); j++)
        dfs(mc[v[i][j]].other(i));
}

int main()
{
    int i, a, b;
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(i = 0; i < m; i++)
    {
        scanf("%d%d", &a, &b);
        a--; b--;
        mc[i].a = a;
        mc[i].b = b;
        mc[i].viz = false;
        v[a].push_back(i);
        v[b].push_back(i);
        if(a != b)
        {
            gr[a]++;
            gr[b]++;
        }
    }
    dfs(0);
    for(i = 0; i < n; i++)
    {
        if(gr[i] == 0 || gr[i] % 2 != 0 || viz[i] == false)
        {
            printf("-1");
            return 0;
        }
    }
    st.push_back(0);
    while(!st.empty())
    {
        a = st.back();
        if(!v[a].empty())
        {
            if(!mc[v[a].back()].viz)
            {
                mc[v[a].back()].viz = true;
                b = mc[v[a].back()].other(a);
                st.push_back(b);
            }
            else v[a].pop_back();
        }
        else
        {
            st.pop_back();
            r.push_back(a);
        }
    }
    for(i = 0; i < r.size() - 1; i++)
        printf("%d ", r[i] + 1);
    return 0;
}