Cod sursa(job #1643255)

Utilizator touristGennady Korotkevich tourist Data 9 martie 2016 18:16:18
Problema Ciclu Eulerian Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <bits/stdc++.h>
#define pb push_back
#define Nmax 100005
#define Mmax 500005

using namespace std;
ofstream fout("ciclueuler.out");

vector <int> L[Nmax];
vector <int>:: iterator it[Nmax];
bool used[Mmax],seen[Nmax];
int grad[Nmax],n,st[Mmax],dr[Mmax];

inline void Dfs1(int nod)
{
    seen[nod]=1;
    for(auto it : L[nod])
    {
        if(seen[it]) continue;
        Dfs1(it);
    }
}

inline bool Conex()
{
    Dfs1(1);
    for(int i=1;i<=n;++i)
        if(!seen[i]) return 0;
    return 1;
}

inline void Dfs(int nod)
{
    while(it[nod]!=L[nod].end())
    {
        if(used[*it[nod]])
        {
            ++it[nod];
            continue;
        }
        used[*it[nod]]=1;
        Dfs(st[*it[nod]]+dr[*it[nod]]-nod);
    }
    fout<<nod<<" ";
}

int main()
{
    int m,i;
    ifstream cin("ciclueuler.in");
    cin>>n>>m;
    for(i=1;i<=m;++i)
    {
        cin>>st[i]>>dr[i];
        L[st[i]].pb(i); L[dr[i]].pb(i);
        ++grad[st[i]]; ++grad[dr[i]];
    }
    for(i=1;i<=n;++i)
        if(grad[i]%2)
        {
            cout<<-1; return 0;
        }
    if(!Conex())
    {
        cout<<-1; return 0;
    }
    for(i=1;i<=n;++i) it[i]=L[i].begin();
    Dfs(1);
    return 0;
}