Cod sursa(job #1790897)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 28 octombrie 2016 20:48:10
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>

using namespace std;

int N, M, start = 1;
vector<vector<int> > G;
vector<int> road;
stack<int> s;
int in[666013],out[666013];

void deleteEdge(int from, int to)
{
    G[from].pop_back();
    G[to].erase(find(G[to].begin(), G[to].end(), from));
}

void euler(int k)
{
    int v;
    do {

        while(!G[k].empty()) {
            v = G[k].back();
            deleteEdge(k, v);
            s.push(k);
            k = v;
        }
        k = s.top(); s.pop();
        road.push_back(k);

    }while(!s.empty());
}

int used[666013], bad;

void DFS(int k)
{
    used[k] = 1;
    for(auto it : G[k])
        DFS(it);
}

void Check()
{
    for(int i = 1; i <= N; ++i)
        if(G[i].size() % 2 == 1)
            bad = 1;
    DFS(1);
    for(int i = 1; i <= N; ++i)
        if(!used[i])
            bad = 1;
}

#define DIM 10000
char buff[DIM];
int poz=0;

void sc(int &numar)
{
     numar = 0;
     //cat timp caracterul din buffer nu e cifra ignor
     while (buff[poz] < '0' || buff[poz] > '9')
          //daca am "golit" bufferul atunci il umplu
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     //cat timp dau de o cifra recalculez numarul
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     }
}


int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);

    cin.sync_with_stdio(false);

    sc(N); sc(M);
    G.resize(N+1);

    for(int i = 1; i <= M; ++i) {
        int a, b;
        sc(a); sc(b);
        G[a].push_back(b);
        G[b].push_back(a);
    }
    if(bad) {
        cout << -1;
        return 0;
    }

    euler(start);
    reverse(road.begin(), road.end());
    for(auto it : road)
        cout << it << " ";


    return 0;
}