Cod sursa(job #1793996)

Utilizator Emil64Emil Centiu Emil64 Data 31 octombrie 2016 19:26:02
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <stdio.h>
#include <vector>

using namespace std;

struct _muchie{
    int a, b;
} muchie[500001]={0};

vector<int> v[100001], stack;
bool folosit[500001]={0};
int sol[500001]={0}, lg, w;

char buff[200000];int pos=0;
FILE*f=freopen("ciclueuler.in","r",stdin);
FILE*g=freopen("ciclueuler.out","w",stdout);
inline void read(int &nr){
    while(buff[pos] < '0' || buff[pos] > '9')if(++pos == 200000) fread(buff, 1, 200000, stdin), pos = 0;
    nr = 0;
    while('0' <= buff[pos] && buff[pos] <= '9') {nr = nr * 10 + buff[pos] - '0';if(++pos == 200000) fread(buff, 1, 200000, stdin), pos = 0;}
}
int main()
{
    int i, j, n, m, nod, w, a, b, _m;
    read(n);read(m);
    for(i=1; i<=m; i++){

        read(a);read(b);
        v[a].push_back(i);
        v[b].push_back(i);
        muchie[i].a = a;
        muchie[i].b = b;
    }

    for(i=1; i<=n; i++)
        if(v[i].size() & 1){

            printf("-1\n");
            return 0;
        }

    stack.push_back(1);
    while(!stack.empty()){

        nod = stack.back();
        if(!v[nod].empty()){
            w = v[nod].back();
            v[nod].pop_back();
            if(!folosit[w]){
                folosit[w] = true;
                _m = muchie[w].a ^ muchie[w].b ^ nod;
                stack.push_back(_m);
            }
        }
        else{
            sol[++lg] = nod;
            stack.pop_back();
        }
    }

    for(i=1; i<lg; i++)
        printf("%d ", sol[i]);
    printf("\n");

}