Cod sursa(job #1279978)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 1 decembrie 2014 11:59:01
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <cstdio>
#include <vector>
#define nmax 100010
#define pb push_back

using namespace std;
vector<int> a[nmax], st;
int viz[nmax];
int n, m, i, x, y;
void dfs(int nod)
{
    viz[nod]=1;
    vector<int>::iterator it;
    for(it=a[nod].begin(); it!=a[nod].end(); ++it)
    if(!viz[*it]) dfs(*it);
}
int main()
{
    freopen("ciclueuler.in", "rt", stdin);
    freopen("ciclueuler.out", "wt", stdout);

    scanf("%d%d", &n, &m);
    for(i=1; i<=m; ++i)
    {
        scanf("%d%d", &x, &y);
        a[x].pb(y);
        a[y].pb(x);
    }

    for(i=1; i<=n; ++i)
    if(a[i].size()&1)
    {
        printf("-1");
        return 0;
    }

    dfs(1);
    for(i=1; i<=n; ++i)
    if(!viz[i])
    {
        printf("-1");
        return 0;
    }
    st.pb(1);
    while(st.size())
    {
        x=st.back();
        if(a[x].size())
        {
            y=a[x].back();
            a[x].pop_back();
            for(vector<int>::iterator it=a[y].begin(); it!=a[y].end(); ++it)
            if(*it==x)
            {
                *it=a[y].back();
                a[y].pop_back();
                break;
            }
            st.pb(y);
        }
        else
        {
            printf("%d ", st.back());
            st.pop_back();
        }
    }
    return 0;
}