Cod sursa(job #3261600)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 6 decembrie 2024 21:30:59
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("sse,avx,fma,avx2,bmi,bmi2,lzcnt,popcnt")

using namespace std;

void solve() {
	int n, m;
	cin >> n >> m;

  vector<int> self_edges(n, 0);
  vector<vector<int>> adj(n);
	vector<pair<int, int>> edges;
	for (int i = 0, u, v; i < m; ++i) {
		cin >> u >> v;
    --u, --v;
    if (u == v) {
      ++self_edges[u];
      continue;
    }
    edges.emplace_back(u, v);
    adj[u].push_back(edges.size() - 1);
    adj[v].push_back(edges.size() - 1);
  }

  vector<bool> vis(n, false);
  function<void(int)> dfs = [&adj, &vis, &dfs, &edges](int u) {
    vis[u] = true;
    for (int index : adj[u]) {
      int v = edges[index].first + edges[index].second - u;
      if (!vis[v])
        dfs(v);
    }
  };

  int start_node = -1;
  bool did_dfs = false;
  for (int i = 0; i < n; ++i) {
    if (adj[i].size() & 1) {
      cout << "-1\n";
      return;
    }

    if (adj[i].size() + self_edges[i] == 0 || vis[i]) {
      continue;
    }
    
    if (did_dfs) {
      cout << "-1\n";
      return;
    }

    dfs(i);
    did_dfs = true;
    start_node = i;
  }

  vis.clear();

  stack<int> st;
  vector<int> tour;
  st.push(start_node);

  while (!st.empty()) {
    int u = st.top();
    if (!adj[u].empty()) {
      int index = adj[u].back();
      if (edges[index].first != -1) {
        int v = edges[index].first + edges[index].second - u;
        edges[index].first = -1;
        st.push(v);
      }
      adj[u].pop_back();
    } else {
      if (st.size() == 1 && adj[u].empty()) {
        st.pop();
        continue;
      }
      tour.push_back(u);
      st.pop();
    }
  }

  for (int u : tour) {
    while (self_edges[u]-- > 0)
      cout << u + 1 << ' ';
    cout << u + 1 << ' ';
  }
}

int main() {

	#ifndef ONLINE_JUDGE
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
	#endif

	int t = 1;
	// cin >> t;

	while (t--)
		solve();
	return 0;
}