filletoto

导航

AT_abc213_d [ABC213D] Takahashi Tour 题解(图&深搜)

传送门

题意

有一个 \(n\) 个点的无向图。从根节点 \(1\) 开始,按如下规则遍历整个图:

  1. 如果有连接这个点的其他点没有走过,则到这个点。如果有多个点,那么按从小到大的顺序走。

  2. 如果有这个点没有其他点或者连接这个点的其他点都走过了,那么:

    • 如果这个点是根节点 \(1\),结束。
    • 否则回到上一个点。

思路

先用 vector 存储这张图(注意是无向图)。由于要按从小到大的顺序,所以还需要进行排序。

再从根节点 \(1\) 开始深搜。用 \(vis\) 数组标记这个点有没有走过。

注意:题目要求的是遍历的过程所以返回的上一个节点编号也要输出。

代码

AC 记录

#include <bits/stdc++.h>
using namespace std;
vector<int> e[200005];
int vis[200005];
int n;
inline void dfs(int x)
{
	vis[x]=1;//标记
	cout << x << " ";
	for(int i=0;i<e[x].size();i++)
	{
		if(!vis[e[x][i]])
		{
			dfs(e[x][i]);
			cout << x << " ";//注意要输出他的上一个节点
		}
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n;
	for(int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);//注意是无向图
	}
	for(int i=1;i<=n;i++)
	{
		sort(e[i].begin(),e[i].end());//从小到大排序
	}
	dfs(1);



	return 0;
}

posted on 2024-02-25 15:48  filletoto  阅读(6)  评论(0编辑  收藏  举报