最小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;
} 
相关推荐
青 春 记 忆6 小时前
LeetCode 21. 合并两个有序链表|Python 解法详解
python·算法·leetcode·链表
Sagittarius_A*8 小时前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
QAQo7T10 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
千里之行,始于足下sanhai10 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场10 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces
计算机小白一个10 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
Loge编程生活10 小时前
打卡信奥刷题(3449)用C++实现信奥题 P10429 [蓝桥杯 2024 省 B] 拔河
开发语言·数据结构·c++·算法·青少年编程
2601_9571746511 小时前
大模型算法 简单 容易 用这个方法
算法
VALENIAN瓦伦尼安教学设备11 小时前
激光对中仪采购要点
数据库·嵌入式硬件·算法
Forever Nore13 小时前
LeetCode 1 两数之和
算法·leetcode·职场和发展