Cod sursa(job #3261589)

Utilizator VladNANegoita Vlad-Andrei VladNA Data 6 decembrie 2024 20:50:56
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 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<unordered_multiset<int>> adj(n);
	for (int i = 0, u, v; i < m; ++i) {
		cin >> u >> v;
    --u, --v;
    if (u == v) {
      ++self_edges[u];
      continue;
    }
    adj[u].insert(v);
    adj[v].insert(u);
  }

  vector<bool> vis(n, false);
  function<void(int)> dfs = [&adj, &vis, &dfs](int u) {
    vis[u] = true;
    for (int v : adj[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();

  bool first = true;
  function<void(int)> print_tour = [&first, &adj, &self_edges, &print_tour] (int u) {
    while (!adj[u].empty()) {
      int v = *adj[u].begin();
      adj[u].erase(adj[u].begin());
      adj[v].erase(adj[v].find(u));
      print_tour(v);
    }
    while(self_edges[u]-- > 0)
      cout << u + 1 << ' ';
    
    if (!first)
      cout << u + 1 << ' ';
    first = false;
  };

  print_tour(start_node);
}

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;
}