Cod sursa(job #2378790)

Utilizator vladuteluVlad Oancea vladutelu Data 12 martie 2019 17:05:19
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

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

struct ura
{
    int nod, nrm;
} aux;

bool viz[100001], vc[500001];
int n, grad[100001], k, nr, v[1000001], st[1000001];
vector<ura> lista[100001];

void euler(int nod)
{
    k++;
    st[k] = nod;
    if(viz[nod]==1)
        while(grad[st[k]]==0 && k!=0)
        {
            ++nr;
            v[nr]=st[k];
            --k;
        }
    else
        viz[nod] = 1;
    if(k)
        for(int i = 0; i<lista[st[k]].size(); i++)
            if(vc[lista[st[k]][i].nrm]==0)
            {
                vc[lista[st[k]][i].nrm]=1;
                grad[st[k]]--;
                grad[lista[st[k]][i].nod]--;
                euler(lista[st[k]][i].nod);
            }
}

int main()
{
    int i, m, n1, n2;
    bool eulerian = true;
    in>>n>>m;
    for(i = 1; i<=m; i++)
    {
        in>>n1>>n2;
        ++grad[n1]; ++grad[n2];
        aux.nod = n2;
        aux.nrm = i;
        lista[n1].push_back(aux);
        aux.nod = n1;
        lista[n2].push_back(aux);
    }

    for(i = 1; i<=n; i++)
        if(grad[i]%2==1)
            eulerian = false;

    if(eulerian)
    {
        euler(1);
        for(i = 1; i<=nr-1; i++)
            out<<v[i]<<" ";
    }
    else out<<-1;
    return 0;
}