voidsolve(){ int n, m; cin >> n >> m; vector<int> din(n + 1), dout(n + 1); vector<int> path; vector<vector<int>> e(n + 1); vector<int> cur(n + 1); for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; e[u].push_back(v); din[v]++; dout[u]++; } for (int i = 1; i <= n; i++) sort(alls(e[i])); function<void(int)> dfs = [&](int u) { int sz = e[u].size(); while (cur[u] < sz) { int v = e[u][cur[u]]; cur[u]++; dfs(v); path.push_back(v); } }; auto euler_dir = [&]() { int x = 0, y = 0, z = 0; for (int i = 1; i <= n; i++) { if (din[i] + 1 == dout[i]) { x = i; y++; } if (din[i] != dout[i]) z++; } bool flag = ((y == 1 && z == 2) || (z == 0)); if (flag == 0) returnfalse; if (x == 0) { for (int i = 1; i <= n; i++) if (din[i]) { x = i; break; } } dfs(x); path.push_back(x); if ((int)path.size() != m + 1) returnfalse; reverse(alls(path)); returntrue; }; if (euler_dir()) { for (auto x : path) cout << x << " "; } else { cout << "No" << endl; } }
structnode2 { int v, id; }; voidsolve2(){ // 有向 int n, m; cin >> n >> m; vector<int> din(n + 1), dout(n + 1); vector<int> path; vector<vector<node2>> e(n + 1); vector<int> cur(n + 1); for (int i = 1; i <= m; i++) { int u, v; cin >> u >> v; e[u].push_back({v, i}); din[v]++; dout[u]++; } function<void(int)> dfs = [&](int u) { int sz = e[u].size(); while (cur[u] < sz) { auto [v, res] = e[u][cur[u]]; cur[u]++; dfs(v); path.push_back(res); } }; auto euler_dir = [&]() { int x = 0, y = 0, z = 0; for (int i = 1; i <= n; i++) { if (din[i] + 1 == dout[i]) { x = i; y++; } if (din[i] != dout[i]) z++; } bool flag = (z == 0); if (flag == 0) returnfalse; if (x == 0) { for (int i = 1; i <= n; i++) if (din[i]) { x = i; break; } } dfs(x); // path.push_back(x); if ((int)path.size() != m) returnfalse; reverse(alls(path)); returntrue; }; if (euler_dir()) { cout << "YES" << endl; for (auto x : path) cout << x << " "; } else { cout << "NO" << endl; } }