Cod sursa(job #2359866)

Utilizator Ciprian_PizzaVasile Capota Ciprian_Pizza Data 1 martie 2019 10:15:51
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <bits/stdc++.h>
#define nmax 100001
#define mmax 500001

using namespace std;

int A[mmax],B[mmax],d[nmax],n,m;
vector <int> L[nmax];
stack <int> c;
bitset <mmax> viz;

void Citire()
{
    ifstream fin("ciclueuler.in");
    int i;
    fin >> n >> m;
    for(i = 1; i <= m; i++)
    {
        fin >> A[i] >> B[i];
        d[A[i]]++;
        d[B[i]]++;
        L[A[i]].push_back(i);
        L[B[i]].push_back(i);
    }
    fin.close();
}

void DFS(int nod)
{
    for(auto i : L[nod])
    {
        int j = A[i] + B[i] - nod;
        if(viz[j] == 0)
        {
            viz[j] = 1;
            DFS(j);
        }
    }
}

bool Eulerian()
{
    DFS(A[1]);
    for(int i = 1; i <= n; i++)
    {
        if(viz[i] == 0) return 0;
        if(d[i]%2 == 1) return 0;
    }
    return 1;
}

void DetCiclu(int nod)
{
    for(auto i : L[nod])
    {
        int j = A[i] + B[i] - nod;
        if(viz[i] == 0)
        {
            viz[i] = 1;
            DetCiclu(j);
        }
    }
    c.push(nod);
}

void CicluEulerian()
{
    ofstream fout("ciclueuler.out");
    if(!Eulerian())
    {
        fout << "-1\n";
        exit(0);
    }
    viz.reset();
    DetCiclu(A[1]);
    while(!c.empty())
    {
        fout << c.top() << " ";
        c.pop();
    }
    fout.close();
}

int main()
{
    Citire();
    CicluEulerian();
    return 0;
}