hdu2586 LCA带边权的Targan算法
http://acm.hdu.edu.cn/showproblem.php?pid=2586
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN=40010;
const int MAXQ=40010;
int n;
//并查集部分
int F[MAXN];//初始为-1
int find(int x)
{
if(F[x]==-1)return x;
return F[x]=find(F[x]);
}
int bing(int u,int v)
{
int t1=find(u);
int t2=find(v);
if(t1!=t2)
{
F[t1]=t2;
}
}
//建图部分
bool vis[MAXN];
int ancestor[MAXN];
struct Edge
{
int to,next;
int val;//每条边的权重
}edge[MAXN<<2];
int head[MAXN],tot;//head初始为-1
void add_edge(int u,int v,int val)
{
edge[tot].next=head[u];
edge[tot].to=v;
edge[tot].val=val;
head[u]=tot++;
// edge[tot].next=head[v];
// edge[tot].to=u;
// edge[tot].val=val;
// head[v]=tot++;
}
int dist[MAXN];
bool flag[MAXN];
//查询部分
struct Query
{
int q,next;
int index;//查询标号
}query[MAXQ<<1];
int answer[MAXQ];//存储每个查询的结果
int h[MAXQ];
int tt;
int Q;
void add_query(int u,int v,int index)
{
query[tt].next=h[u];
query[tt].q=v;
query[tt].index=index;
h[u]=tt++;
query[tt].next=h[v];
query[tt].q=u;
query[tt].index=index;
h[v]=tt++;
}
//LCA部分
void init()
{
tot=0;
memset(F,-1,sizeof(F));
memset(vis,false,sizeof(vis));
memset(ancestor,0,sizeof(ancestor));
memset(head,-1,sizeof(head));
memset(h,-1,sizeof(h));
memset(dist,0,sizeof(dist));
memset(flag,false,sizeof(flag));
tt=0;
}
void LCA(int u,int val)
{
ancestor[u]=u;
vis[u]=true;
dist[u]=val;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
int weight=edge[i].val;
if(vis[v])continue;
LCA(v,val+weight);
bing(u,v);
ancestor[find(u)]=u;
}
for(int i=h[u];i!=-1;i=query[i].next)
{
int v=query[i].q;
if(vis[v])
{
// cout<<ancestor[find(v)]<<endl;
answer[query[i].index]=dist[v]+dist[u]-2*dist[ancestor[find(v)]];
}
}
}
int root;
int main()
{
int T,u,v,val;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&Q);
init();
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&u,&v,&val);
flag[v]=true;
add_edge(u,v,val);
add_edge(v,u,val);
}
for(int i=0;i<Q;i++)
{
scanf("%d%d",&u,&v);
add_query(u,v,i);
}
//找到没有入度的节点作为root
for(int i=1;i<=n;i++)
if(!flag[i])
{
root=i;
break;
}
LCA(root,0);
for(int i=0;i<Q;i++)
{
printf("%d\n",answer[i]);
}
}
}
/*
2
3 2
1 2 10
3 1 15
1 2
2 3
*/
hdu2586 LCA带边权的Targan算法的更多相关文章
- 图之单源Dijkstra算法、带负权值最短路径算法
1.图类基本组成 存储在邻接表中的基本项 /** * Represents an edge in the graph * */ class Edge implements Comparable< ...
- hdu2586(lca模板 / tarjan离线 + RMQ在线)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意: 给出一棵 n 个节点的带边权的树, 有 m 个形如 x y 的询问, 要求输出所有 x, ...
- Expm 10_1 带负权值边的有向图中的最短路径问题
[问题描述] 对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环. package org.xiu68.exp.exp10; p ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- 带鉴权信息的SIP呼叫
带鉴权信息的SIP呼叫 INVITE sip:1000@192.168.50.34SIP/2.0 Via: SIP/2.0/UDP192.168.50.32:2445;branch=z9hG4bK-d ...
- LCA(最近公共祖先)算法
参考博客:https://blog.csdn.net/my_sunshine26/article/details/72717112 首先看一下定义,来自于百度百科 LCA(Lowest Common ...
- 【BZOJ】2120: 数颜色 带修改的莫队算法
[题意]给定n个数字,m次操作,每次询问区间不同数字的个数,或修改某个位置的数字.n,m<=10^4,ai<=10^6. [算法]带修改的莫队算法 [题解]对于询问(x,y,t),其中t是 ...
- CF F - Tree with Maximum Cost (树形DP)给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大。输出最大的值。
题目意思: 给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大.输出最大的值. ...
- AcWing:240. 食物链(扩展域并查集 or 带边权并查集)
动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形. A吃B, B吃C,C吃A. 现有N个动物,以1-N编号. 每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用 ...
随机推荐
- LightOJ1341 Aladdin and the Flying Carpet —— 唯一分解定理
题目链接:https://vjudge.net/problem/LightOJ-1341 1341 - Aladdin and the Flying Carpet PDF (English) S ...
- 人生苦短之Python迭代器
迭代 在Python中,如果给定一个list或者touple,我们可以通过for循环来遍历,将值依次取出,这种遍历称为迭代. 在Python中是通过for...in..来进行遍历的,在Java中则是 ...
- java中的几种内部类
Java中的几种内部类 内部类,听名字就可以知道是什么意思,就是类里面的类.有成员内部类,静态内部类,局部内部类和匿名内部类. 下面说一个每种内部类的的使用. 一. 成员内部类
- TypeError: Unexpected keyword argument passed to optimizer: amsgrad原因及解决办法
原因: AMSgrad只支持2017年12月11日后发行的keras版本 解决办法: pip install --upgrade keras
- JAVA THINGKING (一)
保存数据位置: (1) 寄存器.这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部. (2) 堆栈.驻留于常规RAM(随机访问存储器)区域,这是一种特别快.特别有效的数据保存方式, ...
- SimpliciTI Sample Applications
Sample Applications 介绍了4个简单的示例应用程序来演示SimpliciTI的各种特性和功能. Simple Peer-To-Peer :two linked End-Devices ...
- PB调用C# Windows窗体
以下是PB中的代码:String ls_filenameLong ll_wstyle=1long ll_hwnd,ll_nShowCmdstring ls_lpOperation,ls_lpFile, ...
- layui 复选框checkbox 全选写法
前语:本来我是不想写layui框架的博客的,有的时候数据经过layui渲染后原生的写法就取不到值了,一定要用它框架的写法,实在蛋疼,故写之,以后用到可以省点时间去度娘! HTML: <div i ...
- 解决在IE11浏览器上,css样式不起作用的问题
1.首先下载http://pan.baidu.com/s/1c1DA1Ew并运行; 2.在列表中找到.css双击出现Edit File Type; 3.将MIME Type中改为text/css,点击 ...
- 1.6-1.8 HBase表的物理模型
一.HBase 物理模型 1. 1.Table中的所有行都按照row key的字典序排列: 2.Table在行的方向上分割为多个Region: 3.Region按天小分割的,每个表开始只有一个regi ...