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中的一种,但是我们并不知道它到底是哪一种. 有人用 ...
随机推荐
- 操作系统:使用AT&T实现引导扇区
参考学习于渊的书箱时,里面都是用nasm来写的,而自己更熟悉和使用AT&T的语法,心想用AT&T来实现一下,这个过程是十分漫长与痛苦的,但也收获颇丰. 1. 引导扇区代码 .code1 ...
- UVA10561 Treblecross —— SG博弈
题目链接:https://vjudge.net/problem/UVA-10561 题意: 两个人玩游戏,轮流操作:每次往里面添加一个X,第一个得到XXX的获胜. 题解: 详情请看<训练指南&g ...
- POJ3279 Fliptile —— 状态压缩 + 模拟
题目链接:http://poj.org/problem?id=3279 Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...
- Js中获取显示器、浏览器以及窗口等的宽度与高度的方法
网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...
- codeforces B. George and Round 解题报告
题目链接:http://codeforces.com/contest/387/problem/B 题目意思:给出1-n个问题,以及要满足是good rounde条件下这n个问题分别需要达到的compl ...
- Struts2 拦截器配置及使用
在我的项目中有个需求,实现记录用户操作的系统日志,基于这个功能我首先想到的是Struts 的拦截器.配置一个全部Action都会拦截的拦截,写一个公用的服务.每当用户发送请求到Action 就记录相应 ...
- 《Objective-C高级编程》の内存管理の学习笔记
此日志用于记录下学习过程中碰到的问题 转载请注明出处: http://www.cnblogs.com/xdxer/p/4069650.html <Objective-C高级编程> 人民邮电 ...
- 普通用户Mysql 5.6.13 主从,主主及nagios的mysql slave监控
Master:192.168.209.19 Slave:192.168.209.20 mysql版本:mysql5.6.13 1. 以root身份创建普通用户,如mysql,并创建mysql安装目录: ...
- docker容器的参数如何指定配额
docker容器的参数如何指定配额 1. 内存 现在让我看下内存限制. 第一件事需要注意的是,默认一个容器可以使用主机上的所有内存. 如果你想为容器中的所有进程限制内存,使用docker run命令的 ...
- SublimeLinter js和css的语法检查
JavaScript 语法检查 SublimeLinter-jshint 是基于 nodeJS 下的 jshint 的插件,实际上 SublimeLinter-jshint 调用了 nodeJS 中 ...