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> 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 nodes;
vector vis(n + 1, false);
vector 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  阅读(29)  评论(0)    收藏  举报