最小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
我废话不多说,不多说废话,说废话真的很烦,也不知道大家说不说废话,反我是不说废话
上AC Code:
#include<bits/stdc++.h>
using namespace std;
struct edge{
int p,c;
}b[1005];
int k=0;
bool cmp(edge x,edge y){
if(x.p==y.p) return x.c>y.c;
else return x.p<y.p;
}
struct node{
int data;
int next;
}a[1005];
int head[1005],cnt;
void add(int x,int y){
a[++cnt].data=y;
a[cnt].next=head[x];
head[x]=cnt;
}
bool vis[1005];
int n,s;
void dfs(int s){
vis[s]=1;
cout<<s<<" ";
for(int i=head[s];i!=-1;i=a[i].next){
if(vis[a[i].data]==0){
dfs(a[i].data);
}
}
cout<<s<<" ";
}
int main(){
memset(head,-1,sizeof head);
cin>>n>>s;
for(int i=1;i<=n-1;i++){
int x,y;
cin>>x>>y;
b[++k].p=x;
b[k].c=y;
b[++k].p=y;
b[k].c=x;
sort(b+1,b+k+1,cmp);
add(x,y);
add(y,x);
}
for(int i=1;i<=k;i++){
add(b[i].p,b[i].c);
}
dfs(s);
return 0;
}
OK,我们下期再见!!!!