最小DFS序

时间限制:1秒 内存限制:128M

题目描述

一般来讲,我们在对树进行深度优先遍历时,对于每个节点,在刚进入递归后以及即将回溯前各记录一次该节点的编号,最后产生一个长度为2n的节点的序列就称为树的DFS序。

输入描述

第一行,两个整数n(1<=n<=1000),s,其中n表示树的节点的个数,s表示树的根节点的编号。

接下来的n-1行中,每行有两个整数x,y,表示x和y有一条边

输出描述

输出一组字典序最小的DFS序,每两个数字之间用空格隔开。

样例

输入

复制代码
9 1
1 2
1 7
1 4
2 8
2 5
4 6
4 3
3 9

输出

复制代码
1 2 5 5 8 8 2 4 3 9 9 3 6 6 4 7 7 1
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
int head[N],vis[N],ver[N],Next[N],tot=-1,n,S;
struct node{
	int x,y;
}s[2005];
bool cmp(node a,node b){
	if(a.x!=b.x){
		return a.x<b.x;
	}
	return a.y>b.y;
}
void Add(int x,int y){
	ver[++tot]=y;
	Next[tot]=head[x];
	head[x]=tot;
}
void dfs(int pos){
	vis[pos]=1;
	cout<<pos<<" ";
	for(int i=head[pos];i!=-1;i=Next[i]){
		int ljd=ver[i];
		if(vis[ljd]==0){
			dfs(ljd);
		}
	}
	cout<<pos<<" ";
}
int main(){
	cin>>n>>S;
	memset(head,-1,sizeof(head));
	for(int i=1;i<2*n;i+=2){
		cin>>s[i].x>>s[i].y;
		s[i+1].x=s[i].y;
		s[i+1].y=s[i].x;
	}
	sort(s+1,s+2*n-1,cmp);
	for(int i=1;i<2*n;i++){
		Add(s[i].x,s[i].y);
	}
	dfs(S);
	return 0;
} 
相关推荐
wuweijianlove1 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong2 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志2 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光2 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_112 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg3 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒3 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾3 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
SatVision炼金士3 小时前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法