HDU 3887

View Code
  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <cstring>
  4 #include <algorithm>
  5 #include <iostream>
  6 #include <stack>
  7 #include <vector>
  8 #include <bitset>
  9 
 10 using namespace std;
 11 
 12 #define print(x) cout<<x<<endl
 13 #define input(x) cin>>x
 14 #define SIZE 100010
 15 #define pb push_back
 16 
 17 inline int lowbit(int x){return x&(-x);}
 18 int n,root;
 19 vector<int> g[SIZE];
 20 int l[SIZE],r[SIZE];
 21 //the first visit and the last visit of one node
 22 int baum[SIZE<<1];
 23 int cnt,ans[SIZE];
 24 
 25 int sum(int x)
 26 {
 27     int res=0;
 28     for(int i=x;i>0;i-=lowbit(i))
 29     {
 30         res+=baum[i];
 31     }
 32     return res;
 33 }
 34 
 35 void modify(int x,int val)
 36 {
 37     for(int i=x;i<cnt;i+=lowbit(i))
 38     {
 39         baum[i]+=val;
 40     }
 41 }
 42 
 43 void init()
 44 {
 45     for(int i=0;i<SIZE;i++) g[i].clear();
 46     memset(l,0,sizeof(l));
 47     memset(r,0,sizeof(r));
 48     memset(baum,0,sizeof(baum));
 49     memset(ans,0,sizeof(ans));
 50     cnt=1;
 51 }
 52 
 53 void dfs()
 54 {
 55     stack<int> st;
 56     st.push(root);
 57     bitset<SIZE> visit;
 58     while(!st.empty())
 59     {
 60         int now=st.top();
 61         if(!visit[now])
 62         {
 63             l[now]=cnt++;
 64             visit[now]=true;
 65         }
 66         bool pushed=false;
 67         for(int i=0;i<(int)g[now].size();i++)
 68         {
 69             if(!visit[g[now][i]])
 70             {
 71                 st.push(g[now][i]);
 72                 pushed=true;
 73                 break;
 74             }
 75         }
 76         if(pushed) continue;
 77         
 78         if(visit[now])
 79         {
 80             r[now]=cnt++;
 81             st.pop();
 82         }
 83     }
 84 }
 85 
 86 void slove()
 87 {
 88     for(int i=1;i<=n;i++)
 89     {
 90         ans[i]=sum(r[i])-sum(l[i]-1);
 91         modify(l[i],1);
 92     }
 93 }
 94 
 95 int main()
 96 {
 97     int a,b;
 98     while(input(n>>root) && n+root)
 99     {
100         init();
101         for(int i=0;i<n-1;i++)
102         {
103             scanf("%d%d",&a,&b);
104             g[a].pb(b);
105             g[b].pb(a);
106         }
107         dfs();
108         slove();
109         for(int i=1;i<=n;i++)
110         {
111             if(i>1) printf(" ");
112             printf("%d",ans[i]);
113         }
114         puts("");
115     }
116     return 0;
117 }

posted on 2012-07-06 12:04  Wizmann  阅读(263)  评论(0)    收藏  举报

导航