我的思路是记录dfs序之后,从前往后考虑,当找到一个第一次出现的点时,输出i-1, 这里我特判了一下,如果前面出现两个及以上的“1”,那么输出i-2,不知道哪里假了。
这里i又加了1是因为是从零开始的
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<string>
#include<cmath>
#include<cstring>
#include<set>
#include<map>
using namespace std;
int n;
vector<int> Adj[100005],xu;
void dfs(int x,int fa){
for(int i=0;i<Adj[x].size();++i){
if(Adj[x][i]!=fa){
xu.push_back(Adj[x][i]);
dfs(Adj[x][i],x);
xu.push_back(x);
}
}
}
int main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1,u,v;i<n;++i){
cin>>u>>v;
Adj[u].push_back(v);
Adj[v].push_back(u);
}
xu.push_back(1);
dfs(1,0);
int cnt=1,ans;
set<int> s;
xu.pop_back();
for(int i=0;i<xu.size();++i){
if(xu[i]==1&&i!=0&&cnt<2){
cnt=2;
}
if(s.count(xu[i])==0) s.insert(xu[i]),cout<<i-cnt+1<<'\n';
}
return 0;
}