Cod sursa(job #1182807)

Utilizator andreiagAndrei Galusca andreiag Data 7 mai 2014 19:19:21
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
#include <algorithm>

using namespace std;
const int Nmax = 100555;
const int Mmax = 500555;

int E[Mmax];                // informatia despre muchie
char used[Mmax];    // muchie folosita sau nu ?
int deg[Nmax];              // gradul varfului
vector<int> G[Nmax];

int main()
{
    ifstream f ("ciclueuler.in");
    ofstream g ("ciclueuler.out");

    int N, M, a, b;
    f >> N >> M;
    for (int i = 0; i < M; i++)
    {
        f >> a >> b;
        deg[--a]++;
        deg[--b]++;
        G[a].push_back(i);
        if (a != b) G[b].push_back(i);
        E[i] = a+b;     // muchia[i] = (a+b);
    }

    bool ok = 1;
    for (int i = 0; i < N; i++)
        if (deg[i] %2 == 1)
        {
            ok = 0;
            break;
        }
/*
    for (int i = 0; i < M; i++)
        g << E[i] << (i == M-1 ? '\n' : ' ');
    for (int i = 0; i < N; i++)
        g << i << ":" << deg[i] << (i == N-1 ? '\n' : ' ');
    for (int i = 0; i < M; i++)
        g << used[i] << ' ';    g << '\n';
*/

    if (ok)
    {
        stack<int> S;
        vector<int> sol;
        S.push(0);
        while(!S.empty())
        {
            int varf = S.top();
            if(deg[varf] == 0)
            {
                S.pop();
                sol.push_back(varf+1);      // de la 0-indexed la 1-indexed;
            } else {
                while(used[G[varf].back()])
                    G[varf].pop_back();

                int i = G[varf].back();
                int vecin = E[i] - varf;
                S.push(vecin);
                deg[vecin]--;
                deg[varf]--;
                used[i] = 1;
            }
        }
        sol.pop_back();     // ultimul nod nu-i necesar
        for (auto x: sol)
            g << x << ' ';
        g << '\n';
    } else {
        g << -1 << '\n';
    }

    return 0;
}