Cod sursa(job #3281222)

Utilizator vladm98Munteanu Vlad vladm98 Data 28 februarie 2025 18:18:16
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#include <fstream>

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

vector<pair<int, int>> mat[100005];
int grade[100005], viz[100005], vizMuchii[500005], muchieCrt[100005];
vector<int> euler;
void dfs(int nod)
{
    viz[nod]=1;
    for(auto x:mat[nod]) //cat timp x este in graf, daca
        if(!viz[x.first])
            dfs(x.first);
}

void construire(int nod)
{
    while(muchieCrt[nod]<mat[nod].size()) //cat timp mai pot procesa muchii
    {
        pair<int, int>muchie=mat[nod][muchieCrt[nod]]; //imi iau muchia cu vecin, indice muchie
        muchieCrt[nod]++;
        if(vizMuchii[muchie.second])
            continue; //daca am vizitat deja muchia, nu facem nimic.. (verific dupa indice in vizMuchii
        else
            vizMuchii[muchie.second]=1;
        construire(muchie.first); //continui recursivitate cu urmatorul nod
    }
    euler.push_back(nod); //bagam nodul in vector pt afisare
}

int main()
{
    int n,m, i;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        mat[x].push_back({y,i}); //setez muchiile+INDICI
        mat[y].push_back({x,i});
        grade[x]++;
        grade[y]++;
    }

    dfs(1);
    for(i=1;i<=n;i++)
        if(viz[i]==0 || grade[i]%2!=0) //verificam daca avem ciclu euler
            cout<<-1;
    construire(1); //pt ca incepem de la nod 1

    euler.pop_back();//elimin ultimul 1

    //for(auto x:euler)
    //cout<<x<<" ";

    for(i=1;i<=euler.size(); i++)
        cout<<euler[i]<<" ";

    return 0;
}