hdoj 2586
来源:互联网 发布:常用协议端口号 编辑:程序博客网 时间:2024/06/05 20:56
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- using namespace std;
- //#pragma comment(linker, "/STACK:102400000,102400000") //不需要申请系统栈
- const int N = 40010;
- const int M = 25;
- int dp[2*N][M]; //这个数组记得开到2*N,因为遍历后序列长度为2*n-1
- bool vis[N];
- struct edge
- {
- int u,v,w,next;
- }e[2*N];
- int tot,head[N];
- inline void add(int u ,int v ,int w ,int &k)
- {
- e[k].u = u; e[k].v = v; e[k].w = w;
- e[k].next = head[u]; head[u] = k++;
- u = u^v; v = u^v; u = u^v;
- e[k].u = u; e[k].v = v; e[k].w = w;
- e[k].next = head[u]; head[u] = k++;
- }
- int ver[2*N],R[2*N],first[N],dir[N];
- //ver:节点编号 R:深度 first:点编号位置 dir:距离
- void dfs(int u ,int dep)
- {
- vis[u] = true; ver[++tot] = u; first[u] = tot; R[tot] = dep;
- for(int k=head[u]; k!=-1; k=e[k].next)
- if( !vis[e[k].v] )
- {
- int v = e[k].v , w = e[k].w;
- dir[v] = dir[u] + w;
- dfs(v,dep+1);
- ver[++tot] = u; R[tot] = dep;
- }
- }
- void ST(int n)
- {
- for(int i=1;i<=n;i++)
- dp[i][0] = i;
- for(int j=1;(1<<j)<=n;j++)
- {
- for(int i=1;i+(1<<j)-1<=n;i++)
- {
- int a = dp[i][j-1] , b = dp[i+(1<<(j-1))][j-1];
- dp[i][j] = R[a]<R[b]?a:b;
- }
- }
- }
- //中间部分是交叉的。
- int RMQ(int l,int r)
- {
- int k=0;
- while((1<<(k+1))<=r-l+1)
- k++;
- int a = dp[l][k], b = dp[r-(1<<k)+1][k]; //保存的是编号
- return R[a]<R[b]?a:b;
- }
- int LCA(int u ,int v)
- {
- int x = first[u] , y = first[v];
- if(x > y) swap(x,y);
- int res = RMQ(x,y);
- return ver[res];
- }
- int main()
- {
- //freopen("Input.txt","r",stdin);
- //freopen("Out.txt","w",stdout);
- int cas;
- scanf("%d",&cas);
- while(cas--)
- {
- int n,q,num = 0;
- scanf("%d%d",&n,&q);
- memset(head,-1,sizeof(head));
- memset(vis,false,sizeof(vis));
- for(int i=1; i<n; i++)
- {
- int u,v,w;
- scanf("%d%d%d",&u,&v,&w);
- add(u,v,w,num);
- }
- tot = 0; dir[1] = 0;
- dfs(1,1);
- /*printf("节点ver "); for(int i=1; i<=2*n-1; i++) printf("%d ",ver[i]); cout << endl;
- printf("深度R "); for(int i=1; i<=2*n-1; i++) printf("%d ",R[i]); cout << endl;
- printf("首位first "); for(int i=1; i<=n; i++) printf("%d ",first[i]); cout << endl;
- printf("距离dir "); for(int i=1; i<=n; i++) printf("%d ",dir[i]); cout << endl;*/
- ST(2*n-1);
- while(q--)
- {
- int u,v;
- scanf("%d%d",&u,&v);
- int lca = LCA(u,v);
- printf("%d\n",dir[u] + dir[v] - 2*dir[lca]);
- }
- }
- return 0;
- }
0 0
- hdoj 2586
- HDOJ
- hdoj
- hdoj
- HDOJ
- HDOJ 2586 How far away?
- HDOJ 2586 How far away ?
- HDOJ-2586(Tarjan算法)
- hdoj 2586 How far away ?
- Hdoj 2586 How far away ? 【LCA】
- HDOJ-2586 How far away ?(在线LCA)
- hdoj 1568 && hdoj 5344 && hdoj 5444
- hdoj 2586 How far away ? 【Tarjan离线LCA】
- HDOJ 题目2586 How far away ?(LCA)
- hdoj 2586 How far away ? 【LCA转RMQ入门题】
- HDOJ 2586 How far away ? (LCA ST算法)
- hdoj 2586 <LCA转RMQ算法--学习之路>
- POJ 1986 Distance Queries && HDOJ 2586 How far away?
- ehcache
- Unity3d搭建HTTP弱联网的服务器搭建及客户端编写(二)之php服务器
- Unity用Lua开发的 使用度 问题
- oracle删除添加表空间
- 函数——Python学习笔记03
- hdoj 2586
- POJ3177【边双连通分量缩点】
- 有关Canvas图像覆盖问题
- 为什么用接口存常量是一种不良的习惯
- C语言小游戏————反弹球(简单的图形化界面)
- JSON解析类库之Gson(4) --- TypeAdapter接管序列化与反序列化
- android developer tiny share-20170506
- 重置CSS样式表
- Mac OS X配置Java环境变量