最后一个点TLE了
查看原帖
最后一个点TLE了
538203
哎呀呀呀k楼主2022/7/20 12:53

最后一个点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;
}
2022/7/20 12:53
加载中...