最后一个点TLE了
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
const int N = 200010;
stack<int> ans;
bool vis[N * 2];
int n, m, in[N], out[N];
struct edge {
int v, id;
};
vector<edge> G[N];
bool cmp(edge x, edge y) {
return x.v < y.v;
}
int euler() {
int cntin = 0, cntout = 0;
for (int i = 1; i <= n; i++) {
if (out[i] - in[i] == 1) cntout++;
else if (out[i] - in[i] == -1) cntin++;
else if (out[i] != in[i]) return 0;
}
if (cntout == 0 && cntin == 0) return 1;
else if (cntout == 1 && cntin == 1) {
for (int i = 1; i <= n; i++) {
if (out[i] - in[i] == 1) {
return i;
}
}
} else return 0;
}
void dfs(int u) {
if (out[u]) {
for (int i = 0; i < G[u].size(); i++) {
if (!vis[G[u][i].id]) {
vis[G[u][i].id] = true;
out[u]--;
dfs(G[u][i].v);
}
}
}
ans.push(u);
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
int u, v;
scanf("%d%d", &u, &v);
G[u].push_back({v, i});
out[u]++, in[v]++;
}
for (int i = 1; i <= n; i++) sort(G[i].begin(), G[i].end(), cmp);
int start = euler();
if (start) {
dfs(start);
while (!ans.empty()) {
printf("%d ", ans.top());
ans.pop();
}
printf("\n");
} else printf("No\n");
return 0;
}