时间限制: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
#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;
}