Educational Codeforces Round 78 (Rated for Div. 2)E(构造,DFS)

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]<<"\n";
32     return 0;
33 }

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/12193532.html