Cod sursa(job #2112382)

Utilizator loo_k01Luca Silviu Catalin loo_k01 Data 23 ianuarie 2018 13:35:29
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>
#define Mmax 500001
#define Nmax 100001
using namespace std;
int X[Mmax], Y[Mmax];
/**
    X[i] - nodul din stanga
    Y[i] - nodul din dreapta
    i - muchia dintre noduri
*/

int poz[Nmax]; /// poz unde am ramas in lista de adiacenti ai lui i
int n, m;
int sol[Mmax], K; /// Vector de solutii si lungimea lui
bitset <Mmax> viz; /// vector de vizite pt muchii
vector <int> L[Nmax];

ofstream fout("ciclueuler.out");

void Read()
{
    ifstream fin("ciclueuler.in");
    fin >> n >> m;
    int i;
    for (i = 1; i <= m; i++)
    {
        fin >> X[i] >> Y[i];
        L[X[i]].push_back(i);
        L[Y[i]].push_back(i);
    }
    fin.close();
}

inline bool VerificaParitate()
{
    int i;
    for (i = 1; i <= n; i++)
        if(L[i].size() % 2 == 1) return false;
    return true;
}

inline void DFS(int nod)
{
    while(poz[nod] < L[nod].size())
    {
        int k = L[nod][poz[nod]];
        poz[nod]++; /// avansez in lista de adiacenti
        if(!viz[k])
        {
            viz[k] = true;
            DFS(X[k] + Y[k] - nod);
        }
    }
    sol[++K] = nod;
}

void Solve_Eulerian()
{
    DFS(1);
    for (int i = 1; i < K; i++)
        fout << sol[i] << " ";
    fout << "\n";
}

void Graf_Eulerian()
{
    if (!VerificaParitate())
        fout << "-1\n";
    else
        Solve_Eulerian();
}

int main()
{
    Read();
    Graf_Eulerian();
    fout.close();
    return 0;
}