Advertisement
Guest User

Untitled

a guest
Dec 17th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define f first
  4. #define s second
  5.  
  6. int t,n,deep[10004];
  7. vector<vector<pair<int,int> > >adj;
  8. pair<int,int>parent[20][10004];
  9. string s;
  10.  
  11.  
  12. void dfs(int node,int d){
  13.     deep[node]=d;
  14.     for(int i=0;i<adj[node].size();i++){
  15.         if(!parent[0][adj[node][i].f].f){
  16.             parent[0][adj[node][i].f]=make_pair(node,adj[node][i].s);
  17.             dfs(adj[node][i].f,d+1);
  18.         }
  19.     }
  20. }
  21.  
  22. pair<int,int> KthParent(int x,int k){
  23.     int tem=0;
  24.     if(k==0)
  25.         return make_pair(x,0);
  26.     for(int i=0;i<20;i++){
  27.         if((k>>i)&1){
  28.             tem+=parent[i][x].s;
  29.             x=parent[i][x].f;
  30.         }
  31.     }
  32.     return make_pair(x,tem);
  33. }
  34.  
  35. int lca(int x,int y){
  36.     if(deep[x]<deep[y])
  37.         swap(x,y);
  38.     int k=deep[x]-deep[y];
  39.     for(int i=0;i<20;i++){
  40.         if((k>>i)&1){
  41.             x=parent[i][x].f;
  42.         }
  43.     }
  44.     if(x==y)
  45.         return x;
  46.     for(int i=19;i>=0;i--){
  47.         if(parent[i][x].f!=parent[i][y].f){
  48.             x=parent[i][x].f;
  49.             y=parent[i][y].f;
  50.         }
  51.     }
  52.     return parent[0][x].f;
  53. }
  54.  
  55. int main(){
  56.     cin>>t;
  57.     while(t--){
  58.         memset(deep,0,sizeof deep);
  59.         memset(parent,0,sizeof parent);
  60.         adj.clear();
  61.  
  62.  
  63.         cin>>n;
  64.         adj.resize(n+1);
  65.         for(int i=1,u,v,c;i<n;i++){
  66.             scanf("%d%d%d",&u,&v,&c);
  67.             adj[u].push_back(make_pair(v,c));
  68.             adj[v].push_back(make_pair(u,c));
  69.         }
  70.         parent[0][1]=make_pair(1,0);
  71.         dfs(1,0);
  72.         for(int i=1;i<=15;i++){
  73.             for(int j=1;j<=n;j++){
  74.                 parent[i][j]=make_pair(parent[i-1][parent[i-1][j].f].f,parent[i-1][parent[i-1][j].f].s+parent[i-1][j].s);
  75.             }
  76.         }
  77.         cout<<' '<<parent[1][4].f<<' '<<parent[1][5].s<<endl;
  78.         cout<<' '<<KthParent(5,1).f<<' '<<KthParent(5,1).s<<endl;
  79.         cout<<' '<<KthParent(5,2).f<<' '<<KthParent(5,2).s<<endl;
  80.         cin>>s;
  81.         int a,b,c,k;
  82.         while(s!="DONE"){
  83.             scanf("%d%d",&a,&b);
  84.             int LCA=lca(a,b);
  85.             if(s=="DIST"){
  86.                 int tem=KthParent(a,deep[a]-deep[LCA]).s+KthParent(b,deep[b]-deep[LCA]).s;
  87.                 cout<<tem<<endl;
  88.             }else if(s=="KTH"){
  89.                 scanf("%d",&c);
  90.                 if(c-1<=deep[a]-deep[LCA]){
  91.                     cout<<KthParent(a,c-1).f<<endl;
  92.                 }else{
  93.                     cout<<KthParent(b,deep[b]-deep[LCA]-(c-1-(deep[a]-deep[LCA])) ).f<<endl;
  94.                 }
  95.             }
  96.             cin>>s;
  97.         }
  98.     }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement