Advertisement
Insyder01

Untitled

Jul 22nd, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define L(i, m, n) for(int i(m);i < n;i++)
  3. #define pb push_back
  4. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  5. #define in(x) cin >> x
  6. #define SZ(X) int(X.size())
  7. #define ff first
  8. #define ss second
  9. #define RF(X) freopen(X, "r", stdin)
  10. #define WF(X) freopen(X, "w", stdout)
  11. using namespace std;
  12. typedef long long ll;
  13. typedef pair<ll,ll> pll;
  14. typedef vector<int> vi;
  15. typedef vector<vi> vii;
  16. typedef pair<int,int> pii;
  17. typedef vector<pii> vpii;
  18. typedef pair<int, string> pis;
  19. typedef vector<string> vs;
  20. typedef pair<pair<int, int>, pair<int, int > > piiii;
  21. const int MAXN=10009;
  22. const int LOGMAXN=20;
  23. vector <vpii> adj(MAXN);
  24.  
  25. bool vis[MAXN];
  26. int T[MAXN],P[MAXN][20],cst[MAXN],lvl[MAXN],t,n,k;
  27.  
  28. string blank;
  29. void DFS(int node, int level, int cost,int P){
  30. //    D(node);D(level);
  31.     vis[node]=1;lvl[node]=level;cst[node]+=cost;T[node]=P;
  32.     L(i,0,SZ(adj[node])) if(!vis[adj[node][i].ff]) DFS(adj[node][i].ff,level+1,cost+adj[node][i].ss,node);
  33. }
  34. void process(int N){
  35.     int i, j;
  36.   /**we initialize every element in P with -1**/
  37.       for (i = 1; i <= N; i++)
  38.           for (j = 0; 1 << j <= N; j++)
  39.               P[i][j] = -1;
  40.  
  41.   /**the first ancestor of every node i is T[i]**/
  42.       for (i = 1; i <= N; i++)
  43.           P[i][0] = T[i];
  44.  
  45.   /**bottom up dynamic programing**/
  46.       for (j = 1; 1 << j <= N; j++)
  47.          for (i = 1; i <= N; i++)
  48.              if (P[i][j - 1] != -1)
  49.                  P[i][j] = P[P[i][j - 1]][j - 1];
  50. }
  51. int query(int N,int p, int q)
  52. {
  53.     int log, i;
  54.   /**if p is situated on a higher level than q then we swap them**/
  55.       if (lvl[p] < lvl[q])swap(p,q);
  56.   /**we compute the value of [log(L[p)]**/
  57.       log=floor(log2(lvl[p]));
  58.   /**we find the ancestor of node p situated on the same level
  59.   with q using the values in P**/
  60.       for (i = log; i >= 0; i--)
  61.           if (lvl[p] - (1 << i) >= lvl[q])
  62.               p = P[p][i];
  63.       if (p == q)
  64.           return p;
  65.   /**we compute LCA(p, q) using the values in P**/
  66.       for (i = log; i >= 0; i--)
  67.           if (P[p][i] != -1 && P[p][i] != P[q][i])
  68.               p = P[p][i], q = P[q][i];
  69.       return T[p];
  70. }
  71. void walk(int node, int target){
  72.     if(lvl[node]==target){/**0-Jump**/
  73.         cout << node <<endl;
  74.         return ;
  75.     }
  76.  
  77.     for(int i = floor(log2(lvl[node]));i>=0;i--){
  78.  
  79.         if(lvl[P[node][i]]>= target)node=P[node][i];
  80.     }
  81.     cout << node <<endl;
  82. }
  83. int main(){
  84.     in(t);getline(cin,blank);
  85.     L(test,0,t){
  86.         getline(cin,blank);
  87.         adj.clear();adj.resize(MAXN);memset(vis,0,sizeof(vis));
  88.         memset(T,-1,sizeof(T));
  89.         memset(cst,0,sizeof(cst));
  90.         memset(lvl,0,sizeof(lvl));
  91.         in(n);
  92.         int u,v,w;
  93.         L(i,0,n-1){
  94.             in(u);in(v);in(w);
  95.             adj[u].pb({v,w});adj[v].pb({u,w});
  96.         }
  97.         DFS(1,0,0,-1);
  98.         process(n);
  99.         while(in(blank)){
  100.             if(blank=="DONE") break;
  101.             if(blank=="DIST"){
  102.                 in(u),in(v);
  103.                 int LCA=query(n,u,v);
  104.                 cout << cst[u]+cst[v] - 2 * cst[LCA] <<endl;
  105.             }
  106.             else{
  107.                 in(u),in(v),in(k);
  108.                 int LCA = query(n,u,v);
  109.                 if(lvl[u]-lvl[LCA]+1 >= k){
  110.                     int target=lvl[u]-k+1;
  111.                     walk(u,target);
  112.                 }
  113.                 else{
  114.                     k-=lvl[u]-lvl[LCA]+1;
  115.                     int target=lvl[LCA]+k;
  116.                     walk(v,target);
  117.                 }
  118.             }
  119.             if(test < t-1)puts("");
  120.         }
  121.     }
  122.  
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement