Cod sursa(job #934601)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 30 martie 2013 20:40:13
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.23 kb
#include <cstdio>
#include <cstring>
#include <cassert>

#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <string>
#include <queue>
#include <stack>

#define e first
#define v second

using namespace std;

typedef long long int64;
typedef vector< pair<int, int> >::iterator it;

const int oo = 0x3f3f3f3f;
const int MAX_V = 100005;
const int MAX_E = 500005;

vector< pair<int, int> > G[MAX_V];
int V, E, Degree[MAX_V];
bool Used[MAX_E], Solution;

inline int GetDegree(int X) {
    for (; Degree[X] > 0 && Used[G[X][Degree[X] - 1].e]; --Degree[X]);
    return Degree[X];
}

void Euler(int X, stack< pair<int, int> >& Stack) {
    for (int Y; GetDegree(X) > 0; X = Y) {
        Y = G[X][GetDegree(X) - 1].v;
        Stack.push(make_pair(G[X][GetDegree(X) - 1].e, X));
        Used[G[X][GetDegree(X) - 1].e] = true;
    }
}

vector< pair<int, int> > EulerianCycle(int Start) {
    stack< pair<int, int> > Stack;
    vector< pair<int, int> > Cycle;
    int X = Start;
    do {
        Euler(X, Stack);
        X = Stack.top().v;
        Cycle.push_back(Stack.top());
        Stack.pop();
    } while (!Stack.empty());
    reverse(Cycle.begin(), Cycle.end());
    return Cycle;
}

bool EulerianGraph() {
    for (int X = 1; X <= V; ++X)
        if (Degree[X] % 2 != 0)
            return false;
    return true;
}

void Read() {
    ifstream in("ciclueuler.in");
    in >> V >> E;
    for (int i = 0; i < E; ++i) {
        int X, Y; in >> X >> Y;
        ++Degree[X]; ++Degree[Y];
        G[X].push_back(make_pair(i, Y)); G[Y].push_back(make_pair(i, X));
    }
    in.close();
}

void Print(vector< pair<int, int> >& Cycle) {
    ofstream out("ciclueuler.out");
    if (!Solution) {
        out << "-1\n";
    } else {
        for (size_t i = 0; i < Cycle.size(); ++i)
            out << Cycle[i].v << " ";
        out << "\n";
    }
    out.close();
}

int main() {
    Read();
    vector< pair<int, int> > Cycle;
    Solution = false;
    if (EulerianGraph()) {
        Solution = true;
        Cycle = EulerianCycle(1);
    }
    for (int i = 0; i < E; ++i)
        if (!Used[i])
            Solution = false;
    Print(Cycle);
    return 0;
}