Cod sursa(job #3362275)

Utilizator Belea_DariusBelea Mihai Darius Belea_Darius Data 5 august 2026 13:35:07
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <bits/stdc++.h>
#define MAXN 100000
#define MAXM 500000

using namespace std;

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

vector <pair<int, int>> graf[MAXN + 1];
int grad[MAXN + 1], viz[MAXM + 1], sef[MAXN + 1], sz[MAXN + 1];

int find_sef(int i){
    if(sef[i] == i){
        return i;
    }
    return sef[i] = find_sef(sef[i]);
}
void union_sef(int a, int b){
    int sef_a, sef_b, ax;

    sef_a = find_sef(a);
    sef_b = find_sef(b);

    if(sz[sef_a] < sz[sef_b]){
        ax = sef_a;
        sef_a = sef_b;
        sef_b = ax;
    }
    sz[sef_a] += sz[sef_b];
    sef[sef_b] = sef_a;
}

void euler(int nod){
    int i;

    for(i = 0; i < graf[nod].size(); i++){
        if(viz[graf[nod][i].second] == 0){
            viz[graf[nod][i].second] = 1;
            euler(graf[nod][i].first);
        }
    }
    fout << nod << " ";
}

int main()
{
    int n, m, i, a, b, cnt;

    fin >> n >> m;
    for(i = 1; i <= n; i++){
        sef[i] = i;
        sz[i] = 1;
    }
    cnt = n;

    for(i = 1; i <= m; i++){
        fin >> a >> b;

        if(find_sef(a) != find_sef(b)){
            cnt--;
            union_sef(a, b);
        }

        grad[a]++;
        grad[b]++;
        graf[a].push_back({b, i});
        graf[b].push_back({a, i});
    }

    i = 1;
    while(i <= n && grad[i] % 2 == 0){
        i++;
    }
    if(i <= n || cnt > 1){
        fout << "-1\n";
    }else{
        euler(1);
        fout << "\n";
    }
    return 0;
}