Cod sursa(job #2279230)

Utilizator alextodoranTodoran Alexandru Raul alextodoran Data 9 noiembrie 2018 10:38:37
Problema Ciclu Eulerian Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <bits/stdc++.h>

#define NM 100002
#define MM 500002

using namespace std;

struct edge
{
    int u, v;
    bool viz;
    int other(int u)
    {
        return this->u + this->v - u;
    }
};

int n, m;
edge edges[MM];

vector <edge*> gr[NM];

vector <int> ans;

void euler(int u)
{
    while(!gr[u].empty() && gr[u].back()->viz)
        gr[u].pop_back();
    for(int i = gr[u].size() - 1; i >= 0; i--)
        if(gr[u][i]->viz == 0)
        {
            gr[u][i]->viz = 1;
            euler(gr[u][i]->other(u));
        }
    ans.push_back(u);
}

int main()
{
    ifstream fin ("ciclueuler.in");
    ofstream fout ("ciclueuler.out");
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    fin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        fin >> edges[i].u >> edges[i].v;
        edges[i].viz = 0;
        gr[edges[i].u].push_back(&edges[i]);
        gr[edges[i].v].push_back(&edges[i]);
    }
    euler(1);
    if(ans.size() != m + 1 || ans.front() != ans.back())
        fout << "-1\n";
    else
    {
        ans.pop_back();
        for(auto i : ans)
            fout << i << " ";
    }
    return 0;
}