Cod sursa(job #3197793)

Utilizator ayannnnAyan Sorouri-Amoughin ayannnn Data 27 ianuarie 2024 14:39:34
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

struct edge{
    int n1,n2;
};

edge edges[1000001];

vector<int> G[100001], ciclu;
bool used[1000001];
int n,m;

void dfs(int node){
    used[node] = 1;
    for(auto nxt : G[node]){
        if(used[edges[nxt].n1 + edges[nxt].n2 - node]){
            continue;
        }
        dfs(edges[nxt].n1 + edges[nxt].n2 - node);
    }
}

bool eulerok(){
    dfs(1);
    for(int i=1; i<=n; i++)
        if(!used[i] || G[i].size() % 2 == 1){
            return 0;
        }
    return 1;
}

int nextedge(int node){
    while(!G[node].empty() && used[G[node].back()])
        G[node].pop_back();
    if(!G[node].empty()){
        int new_edge = G[node].back();
        G[node].pop_back();
        used[new_edge] = 1;
        if(edges[new_edge].n1 == node)
            return edges[new_edge].n2;
        else
            return edges[new_edge].n1;
    }
    return 0;
}

void euler(int node){
    while(int nxt = nextedge(node))
        euler(nxt);
    ciclu.push_back(node);
}
int main()
{
    cin>>n>>m;
    for(int i=1; i<=m; i++){
        int x, y;
        cin >> x >> y;
        edges[i] =  {x, y};
        G[x].push_back(i);
        G[y].push_back(i);
    }
    if(!eulerok()){
        cout<<"-1"<<'\n';
        return 0;
    }
    memset(used, 0, sizeof used);
    euler(1);
    for(int i=0; i <= (int)ciclu.size() - 2; i++)
        cout<<ciclu[i]<<' ';
    cout<<'\n';
    return 0;
}