DFS,把和当前结点相连的点全都括在当前结点左右区间里,它们的左端点依次++,然后对这些结点进行DFS,优先对左端点更大的进行DFS,这样它右端点会先括起来,和它同层的结点(后DFS的那些)的区间会把它括起来,这样它们就不会相交了。
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 int cnt=1; 5 vector<int>v[500007]; 6 int l[500007],r[500007]; 7 void dfs(int x,int fa){ 8 for(int i=0;i<v[x].size();++i) 9 if(v[x][i]!=fa) 10 l[v[x][i]]=++cnt; 11 r[x]=++cnt; 12 for(int i=v[x].size()-1;i>=0;--i) 13 if(v[x][i]!=fa) 14 dfs(v[x][i],x); 15 } 16 int main(){ 17 ios::sync_with_stdio(false); 18 cin.tie(NULL); 19 cout.tie(NULL); 20 int n; 21 cin>>n; 22 for(int i=1;i<n;++i){ 23 int x,y; 24 cin>>x>>y; 25 v[x].push_back(y); 26 v[y].push_back(x); 27 } 28 dfs(1,0); 29 l[1]=1; 30 for(int i=1;i<=n;++i) 31 cout<<l[i]<<" "<<r[i]<<" "; 32 return 0; 33 }