题目传送门
一道 dfs
序题……
题目中高桥每次只会去最小的那个点,所以要先对整张图进行排序。
1
| for (int i = 1; i <= n; i++) sort(g[i].begin(), g[i].end());
|
然后考虑 dfs
。高桥不会走重复的点,所以我们可以开一个 vis
数组进行标记。然后我们需要处理高桥君如果无路可走会返回上一个点的情况。在 dfs
回溯后输出当前节点即可。
1 2 3 4 5 6 7 8 9
| void dfs(int cur) { vis[cur] = 1; cout << cur << " "; for (auto v : g[cur]) { if (vis[v]) continue; dfs(v); cout << cur << " "; } }
|
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| #include <bits/stdc++.h> #define ll long long #define INF 1e9 using namespace std; vector <int> g[200005]; bool vis[200005]; int n; void dfs(int cur) { vis[cur] = 1; cout << cur << " "; for (auto v : g[cur]) { if (vis[v]) continue; dfs(v); cout << cur << " "; } } signed main() { ios :: sync_with_stdio(0); cin >> n; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } for (int i = 1; i <= n; i++) sort(g[i].begin(), g[i].end()); dfs(1); return 0; }
|