Cod sursa(job #2355314)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 25 februarie 2019 22:55:57
Problema Ciclu Eulerian Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

const int VAL=500005;

int N, M, i, j, A[VAL], B[VAL], st[VAL], top;
bool viz[VAL], gasit;
vector <int> G[VAL];
vector <int> :: iterator it;

void Ciclu_Euler()
{
    if (top==M)
    {
        for (int i=1; i<=top; i++)
            fout << st[i] << " ";
        fout << st[1];
        gasit=true;
        return;
    }
    int nod=st[top];
    vector <int> :: iterator it;
    for (it=G[nod].begin(); it!=G[nod].end(); it++)
    {
        if (viz[*it]==false)
        {
            viz[*it]=true;
            if (A[*it]==nod)
            {
                st[++top]=B[*it];
                Ciclu_Euler();
            }
            else
            {
                st[++top]=A[*it];
                Ciclu_Euler();
            }
            if (gasit==true)
                return;
            viz[*it]=false;
            top--;
        }
    }
}

int main()
{
    fin >> N >> M;
    for (i=1; i<=M; i++)
    {
        fin >> A[i] >> B[i];
        G[A[i]].push_back(i);
        G[B[i]].push_back(i);
    }
    for (i=1; i<=N; i++)
    {
        if (G[i].size() % 2==1)
        {
            fout << -1;
            fin.close();
            fout.close();
            return 0;
        }
    }
    st[1]=top=1;
    Ciclu_Euler();
    fin.close();
    fout.close();
    return 0;
}