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];
}
}

浙公网安备 33010602011771号