Cod sursa(job #1245702)

Utilizator atatomirTatomir Alex atatomir Data 19 octombrie 2014 20:55:46
Problema Ciclu Eulerian Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;

struct muchie{
    long n1,n2;
    bool used;

    muchie operator()(long nn1,long nn2){
        n1 = nn1; n2 = nn2;
        used = false;
        return *this;
    }
}e;

#define maxN 100010

long n,m,i,x,y;
vector<muchie> G;
vector<long> list[maxN];
bool vis[maxN];
long neigh[maxN];

inline long getDir(long nod,long pos){
    pos = list[nod][pos];
    if(G[pos].n1 == nod) return G[pos].n2;
    else return G[pos].n1;
}

void bfs(long nod){
    queue<long> Q;
    vis[nod] =true; Q.push(nod);
    while(!Q.empty()){
        nod = Q.front(); Q.pop();
        for(long i=0;i<list[nod].size();i++){
            long newNod = getDir(nod,i);
            if(!vis[newNod]) {
                vis[newNod] = true;
                Q.push(newNod);
            }
        }
    }
}

inline bool isEuler() {
    for(i=1;i<=n;i++)
        if((!vis[i]) || (neigh[i] % 2))
         return false;
    return true;
}

void Euler(long nod){
    for(long i=0;i<list[nod].size();i++){
        if(G[list[nod][i]].used) continue;
        long newNod = getDir(nod,i);
        G[list[nod][i]].used = true;
        Euler(newNod);
    }
    if(nod > 1) printf("%ld ",nod);
}

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

    scanf("%ld %ld",&n,&m);
    for(i=1;i<=m;i++){
        scanf("%ld %ld",&x,&y);
        G.push_back(e(x,y));
        list[x].push_back(i-1); neigh[x]++;
        list[y].push_back(i-1); neigh[y]++;
    }

    bfs(1);

    if(!isEuler()){
        printf("-1");
    } else {
        printf("1 ");
        Euler(1);
    }

    return 0;
}