Cod sursa(job #1793141)

Utilizator zdavid112zIon David-Gabriel zdavid112z Data 30 octombrie 2016 19:56:29
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#if 0
#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];

vector<int> v[100005];
int n, m;
vector<int> st;

#if 0
void euler(int n)
{
    for(int i = 0; i < v[n].size(); i++)
    {
        if(mc[v[n][i]].viz)
            continue;
        mc[v[n][i]].viz = true;
        euler(mc[v[n][i]].other(n));
    }
    st.push_back(n);
    /*while(!v[i].empty())
    {
        int a = v[i].back();
        v[i].pop_back();
        v[a].erase(find(v[a].begin(), v[a].end(), i));
        euler(a);
    }*/
}
#endif

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);
    }
    for(i = 0; i < st.size() - 1; i++)
        printf("%d ", st[i] + 1);
    return 0;
}

#endif

#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

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

void euler(int i)
{
    while(!v[i].empty())
    {
        int a = v[i].back();
        v[i].pop_back();
        v[a].erase(find(v[a].begin(), v[a].end(), i));
        euler(a);
    }
    st.push_back(i);
}

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

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--;
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs(0);
    for(i = 0; i < n; i++)
    {
        if(v[i].size() == 0 || v[i].size() % 2 != 0 || viz[i] == false)
        {
            printf("-1");
            return 0;
        }
    }
    euler(0);
    for(i = 0; i < st.size() - 1; i++)
        printf("%d ", st[i] + 1);
    return 0;
}