88 pts TLE 求优化
查看原帖
88 pts TLE 求优化
688783
SilverLi楼主2023/10/2 15:28
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
constexpr int N = 5e3 + 5;
int n, m, vis[N], tmp[N];
vector<int> g[N], ans;
void special(int u, int fa) {
	vis[u] = 1;
	ans.emplace_back(u);
	priority_queue<int, vector<int>, greater<int>> q;
	for (int l = 0; l < g[u].size(); ++l) {
		int i = g[u][l];
		if (i != fa && !vis[i])	q.push(i);
	}
	while (!q.empty()) {
		int v = q.top();
		q.pop();
//		cerr << "  " << u << ' ' << v << '\n';
		special(v, u);
	}
}
// 字典序
inline vector<int> min(vector<int> a, vector<int> b) {
	if (a.size() != b.size())	return b;
	for (int i = 0; i < n; ++i)
		if (a[i] < b[i])	return a;
		else if (a[i] > b[i])	return b;
	return a;
}
int U[N], V[N];
// 删边
inline void init(int id) {
	for (int i = 1; i <= n; ++i)
		g[i].clear();
	for (int i = 1; i <= m; ++i) {
		if (i == id)	continue;
		int u = U[i], v = V[i];
		g[u].emplace_back(v);
		g[v].emplace_back(u);
	}
}
signed main() {
//	freopen("travel.in", "r", stdin);
//	freopen("travel.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; ++i) {
		int u, v;
		scanf("%d%d", &u, &v);
		U[i] = u, V[i] = v;
	}
	if (m == n - 1) {
		init(0);
		special(1, 0);
		for (int i = 0; i < n; ++i)
			printf("%d ", ans[i]);
		return 0;
	}
	vector<int> res;
	for (int i = 0; i < n; ++i)
		res.emplace_back(0x3f3f3f3f);
	for (int i = 1; i <= m; ++i) {
		ans.clear();
		init(i);
//		cerr << i << '\n';
		memset(vis, 0, sizeof(vis));
		special(1, 0);
		res = min(ans, res);
	}
	for (int i = 0; i < n; ++i)
		printf("%d ", res[i]);
	return 0;
}
2023/10/2 15:28
加载中...