Cod sursa(job #1398083)

Utilizator smaraldaSmaranda Dinu smaralda Data 23 martie 2015 22:54:01
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include<stdio.h>
#include<vector>
using namespace std;

const int NMAX = 1e5 + 5, MMAX = 5e5 + 5;

int n, m;

pair <int, int> edge[MMAX];
vector <int>::iterator it[NMAX];
bool vis[MMAX];

vector <int> graph[NMAX];
vector <int> cycle;

int deg[NMAX];

int newNode;
void euler (int node) {
    while(it[node] != graph[node].end()) {
        if(vis[*it[node]]) {
            ++ it[node];
            continue;
        }

        newNode = edge[*it[node]].first + edge[*it[node]].second - node;
        vis[*it[node]] = 1;
        ++ it[node];

        euler(newNode);
    }

    cycle.push_back(node);
}

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

    scanf("%d%d", &n, &m);
    for(i = 1; i <= m; ++ i) {
        scanf("%d%d", &a, &b);
        
        edge[i] = make_pair(a, b);
        graph[a].push_back(i);
        graph[b].push_back(i);

        ++ deg[a];
        ++ deg[b];
    }

    for(i = 1; i <= n; ++ i) 
        if(deg[i] % 2 == 1) {
            printf("-1\n");
            return 0;
        }

    for(i = 1; i <= n; ++ i)
        it[i] = graph[i].begin();

    euler(1);

    for(i = 1; i < cycle.size(); ++ i)
        printf("%d ", cycle[i]);
    return 0;
}