zoukankan      html  css  js  c++  java
  • 萌萌哒哒的2233娘~~~~

      1 #include <cstdio>
      2 #include <iostream>
      3 #include <cmath>
      4 #include <queue>
      5 #include <algorithm>
      6 #include <cstring>
      7 #include <climits>
      8 #define MAXN 20000+10
      9 using namespace std;
     10 int n,m,q,num,head[MAXN],t;
     11 int v[MAXN],fa[MAXN][100],g[MAXN][100];
     12 int deep[MAXN];
     13 struct Edge{
     14     int next,dis,to,from;
     15 }edge[MAXN<<1];
     16 void add(int from,int to,int dis)
     17 {
     18     edge[++num].next=head[from];
     19     edge[num].to=to;
     20     edge[num].from=from;
     21     edge[num].dis=dis;
     22     head[from]=num;
     23 }
     24 void dfs(int x)
     25 {
     26     for(int i=head[x];i;i=edge[i].next)
     27     if(!deep[edge[i].to])
     28     {
     29         deep[edge[i].to]=deep[x]+1;
     30         g[edge[i].to][0]=edge[i].dis;
     31         fa[edge[i].to][0]=x;
     32         dfs(edge[i].to);
     33     }
     34 }
     35 void init()
     36 {
     37     deep[1]=1;
     38     dfs(1);
     39     for(int j=1;(1<<j)<=n;j++)
     40         for(int i=1;i<=n;i++)
     41         if(fa[i][j-1])    
     42             fa[i][j]=fa[fa[i][j-1]][j-1],
     43             g[i][j]=g[i][j-1]+g[fa[i][j-1]][j-1];
     44 }
     45 int query(int k,int from,int to)
     46 {
     47     int a=from,b=to;
     48     if(deep[a]>deep[b]) swap(a,b);
     49     int d=deep[b]-deep[a],ans=0,lca=0;
     50     for(int i=0;(1<<i)<=d;i++)
     51         if((1<<i)&d) ans+=g[b][i],b=fa[b][i];
     52     if(a==b) lca=a;
     53     else
     54     {
     55         for(int j=30;j>=0;j--)
     56         if(fa[a][j]!=fa[b][j])
     57         {
     58             ans+=g[a][j]+g[b][j];
     59             a=fa[a][j];b=fa[b][j];
     60         }
     61         ans+=g[a][0]+g[b][0];lca=fa[a][0];
     62     }
     63     
     64     if(k==-1) return ans;
     65     int df=deep[from]-deep[lca]+1,dt=deep[to]-deep[lca]+1,p=0;
     66     if(k==df) return lca;
     67     if(k<df)
     68     {
     69         p=from,k=k-1;
     70     }
     71     else
     72     {
     73         p=to,k=(df+dt-1)-k;
     74     }
     75     for(int j=0;(1<<j)<=k;j++)
     76             if((1<<j)&k) p=fa[p][j];
     77     return p;
     78 }
     79 int main()
     80 {
     81     freopen("i.in","r",stdin);
     82     freopen("i.out","w",stdout);
     83     scanf("%d",&t);
     84     for(int l=1;l<=t;l++)
     85     {
     86         num=0;
     87         memset(edge,0,sizeof(edge));
     88         memset(head,0,sizeof(head));
     89         memset(fa,0,sizeof(fa));
     90         memset(g,0,sizeof(g));
     91         memset(deep,0,sizeof(deep));
     92         scanf("%d",&n);
     93         int x,y,z;
     94         for(int i=1;i<n;i++)
     95         {
     96             scanf("%d%d%d",&x,&y,&z);
     97             add(x,y,z);
     98             add(y,x,z);
     99         }
    100         init();
    101         char c[10];
    102         while(scanf("%s",c)&&(!(c[0]=='D'&&c[1]=='O')))
    103         {
    104             if(c[0]=='D')
    105             {
    106                 scanf("%d%d",&x,&y);
    107                 printf("%d
    ",query(-1,x,y));
    108             }else
    109             if(c[0]=='K')
    110             {
    111                 scanf("%d%d%d",&x,&y,&z);
    112                 printf("%d
    ",query(z,x,y));
    113             }
    114         }
    115         printf("
    ");
    116     }
    117     return 0;
    118 }
  • 相关阅读:
    子类构造函数 supper关键字
    匿名内部类
    IK 分词器 源码分析
    java重写equals方法
    java编程思想
    设置centos7默认运行级别
    centos7配置wordpress
    python安装tkinter
    centos 7编译安装apache
    关于python中带下划线的变量和函数 的意义
  • 原文地址:https://www.cnblogs.com/yangyaojia/p/6385008.html
Copyright © 2011-2022 走看看