Cod sursa(job #1790890)

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

using namespace std;

int N, M, start = 1;
vector<vector<int> > G;
vector<int> road;
stack<int> s;

void deleteEdge(int from, int to)
{
    G[from].pop_back();
    ///G[from].erase(find(G[from].begin(), G[from].end(), to));
    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());

}

#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);
    }

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


    return 0;
}