Cod sursa(job #1967394)

Utilizator tudi98Cozma Tudor tudi98 Data 16 aprilie 2017 16:20:01
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 2.37 kb
#include <bits/stdc++.h>
using namespace std;

#define REP(i,a) for (int i = 0; i < a; i++)
#define FOR(i,a,b) for (int i = a; i <= b; i++)
#define ROF(i,a,b) for (int i = a; i >= b; i--)
#define FOREACH(it,x) for (auto it: (x))
#define pb push_back
#define mp make_pair
#define SZ(x) ((int)(x).size())

int n,m;
vector<int> G[100001];
vector<int> Sol;
bool seen[100001];
int grad[100001];

void dfs(int node)
{
    seen[node] = 1;
    FOREACH(it,G[node]) if (!seen[it]) dfs(it);
}


class InputReader
{
    public:
        InputReader() {}
        InputReader(const char* file_name)
        {
            input_file = fopen(file_name,"r");
            cursor = 0;
            fread(buff,SIZE,1,input_file);
        }

        inline InputReader &operator >>(int& n)
        {
            n = 0;
            while (buff[cursor] < '0' || buff[cursor] > '9')
                advance();
            while (buff[cursor] >= '0' && buff[cursor] <= '9') {
                n = n * 10 + buff[cursor] - '0';
                advance();
            }
            return *this;
        }

    private:
        static const int SIZE = 1<<17;
        int cursor;
        FILE *input_file;
        char buff[SIZE];

        inline void advance() {
            cursor++;
            if (cursor == SIZE) {
                cursor = 0;
                fread(buff,SIZE,1,input_file);
            }
        }
};

int main()
{
    InputReader fin = InputReader("ciclueuler.in");
    ofstream fout("ciclueuler.out");

    fin >> n >> m;
    while (m--) {
        int x,y;
        fin >> x >> y;
        G[x].pb(y);
        grad[x]++,grad[y]++;
        G[y].pb(x);
    }

    int comp = 0;
    FOR(i,1,n) {
        if (!seen[i]) dfs(i), comp++;
        if (grad[i] % 2 != 0) comp = 2;
        if (comp > 1) break;
    }

    if (comp > 1) {
        fout << "-1";
        return 0;
    }

    stack<int> S; S.push(1);
    while (!S.empty())
    {
        int u = S.top();
        if (SZ(G[u]))
        {
            int v = G[u].back(); G[u].pop_back();
            FOR(i,0,SZ(G[v])-1) if (G[v][i] == u) {
                G[v].erase(G[v].begin()+i);
                break;
            }
            S.push(v);
            continue;
        }
        Sol.pb(u);
        S.pop();
    }

    Sol.pop_back();
    FOREACH(it,Sol) fout << it << " ";
}