D. Lunar New Year and a Wander

https://codeforces.com/problemset/problem/1106/D

题意:给一个无向图,从顶点1开始遍历,求最小字典序。

思路:直接dfs,再维护一个set记录当前可达的最小顶点即可。

总结;要注意vis数组的标记时机,应该在访问时(更新答案时标记)

inline void solve() {
	int n, m;
	cin >> n >> m;

	vector<vector<int>> al(n + 1);
	for (int i = 0; i < m; ++i) {
		int u, v;
		cin >> u >> v;
		al[u].push_back(v);
		al[v].push_back(u);
	}

	set<int> nodes;
	vector<bool> vis(n + 1, false);
	vector<int> ans;
	ans.reserve(n);
	auto dfs = [&](auto&& self, int u)->void {
		ans.push_back(u);
		vis[u] = true;
		for (auto v : al[u]) {
			if (vis[v]) {
				continue;
			}
			vis[v] = true;
			nodes.insert(v);
		}

		if (!nodes.empty()) {
			auto v = *nodes.begin();
			nodes.erase(nodes.begin());
			self(self, v);
		}
	};
	dfs(dfs, 1);

	for (int i = 0; i < n; ++i) {
		cout << ans[i] << " \n"[i == n - 1];
	}
}
posted @ 2025-05-14 11:44  _Yxc  阅读(12)  评论(0)    收藏  举报