Cod sursa(job #1323314)

Utilizator japjappedulapPotra Vlad japjappedulap Data 20 ianuarie 2015 22:17:19
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <vector>
using namespace std;

#define PII pair<int,int>
#define x first
#define y second

ifstream is ("ciclueuler.in");
ofstream os ("ciclueuler.out");

int N, M;
vector <PII> E;
vector <int> G[100051], Circuit;
bool B[500001];

bool IsEuler();
void DFS(int i);

int main()
{
    is >> N >> M;
    E.resize(M+1);
    for (int i = 1, a, b; i <= M; ++i)
    {
        is >> a >> b;
        G[a].push_back(i);
        G[b].push_back(i);
        E[i] = {a, b};
    }
    if (IsEuler())
    {
        DFS(1);
        for (int i = 0; i < Circuit.size()-1; ++i)
            os << Circuit[i] << ' ';
    }
    else
        os << -1;
    is.close();
    os.close();
}

#define e G[i].back()

void DFS(int i)
{
    while (!G[i].empty())
    {
        if (B[e])
        {
            G[i].pop_back();
            continue;
        }
        B[e] = 1;
        DFS(E[e].x + E[e].y - i);
    }
    Circuit.push_back(i);
};

bool IsEuler()
{
    for (int i = 1; i <= N; ++i)
        if (G[i].size() % 2 == 1) return 0;
    return 1;
};