这道题相当于将这两题结合:

  http://poj.org/problem?id=2763

  http://codeforces.com/gym/101808/problem/K

题意:有N各点N条边的带权无向图(相当于一棵树多了一条边),两种操作:修改一条边的权值;求两点间的最短路径。

分析:将任意一条边取出来,其余n-1条边可以结合LCA解最短路。询问时,比较通过取出的边和仅通过树上的边的路径的大小,最小值就是两点的最短路径。

树状数组差分维护点到根节点的距离,根据dfs序来记录需要维护的范围。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define maxn 100005
typedef long long LL;
struct Edge{
int to,next,id;
}edge[maxn<<]; int n,a[maxn],head[maxn],dep[maxn<<],cnt,pos[maxn],dfs_seq[maxn<<],dfn,f[maxn<<][];
int L[maxn],R[maxn],dfs_clock,G[maxn];
LL W[maxn],C[maxn]; inline void add(int u,int v,int id){
edge[cnt].to=v;
edge[cnt].next=head[u];
edge[cnt].id=id;
head[u]=cnt++;
} inline int lowbit(int x){return (x)&(-x);} void init(){
memset(head,-,sizeof(head));
memset(pos,-,sizeof(pos));
memset(C,,sizeof(C));
cnt=dfn=;
dfs_clock=;
} void dfs(int u,int deep)
{
dfs_seq[dfn]=u,dep[dfn]=deep,pos[u]=dfn++;
L[u]=++dfs_clock;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(pos[v]==-){
G[edge[i].id]=v; //important
dfs(v,deep+);
dfs_seq[dfn]=u,dep[dfn++]=deep;
}
}
R[u]=dfs_clock;
} void init_RMQ(int n)
{
for(int i=;i<=n;++i) f[i][]=i;
for(int j=;(<<j)<=n;++j)
for(int i=;i+(<<j)-<=n;++i){
if(dep[f[i][j-]]<dep[f[i+(<<(j-))][j-]]) f[i][j]=f[i][j-];
else f[i][j]=f[i+(<<(j-))][j-];
}
} inline int RMQ(int L,int R)
{
int k=;
while(<<(k+)<=R-L+) ++k;
if(dep[f[L][k]]<dep[f[R-(<<k)+][k]]) return f[L][k];
return f[R-(<<k)+][k];
} inline int lca(int u,int v)
{
if(pos[u]>pos[v]) return dfs_seq[RMQ(pos[v],pos[u])];
return dfs_seq[RMQ(pos[u],pos[v])];
} inline void update(int i,LL x)
{
for(;i<=n;i+=lowbit(i)) C[i]+=x;
} inline LL sum(int i)
{
LL s=;
for(;i>;i-=lowbit(i)) s+=C[i];
return s;
} inline LL dist(int u,int v)
{
return sum(L[u])+sum(L[v])-*sum(L[lca(u,v)]);
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int i,u,v,k,q,s,T;
LL w;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&q);
init();
for(i=;i<=n-;++i){
scanf("%d%d%lld",&u,&v,&w);
add(u,v,i);
add(v,u,i);
W[i]=w;
}
dfs(,);
init_RMQ(dfn-);
int X,Y; LL Z;
scanf("%d%d%lld",&X,&Y,&Z); //第n条边
W[n] = Z;
for(i=;i<n;++i){
update(L[G[i]],W[i]);
update(R[G[i]]+,-W[i]);
} while(q--){
scanf("%d",&k);
if(k==){
scanf("%d%lld",&u,&w);
if(u==n)
W[n] = w;
else{
update(L[G[u]],w-W[u]);
update(R[G[u]]+,-w+W[u]);
W[u]=w;
}
}
else{
scanf("%d%d",&u,&v);
LL ans=dist(u,v);
ans=min(ans,dist(u,X)+dist(v,X));
ans=min(ans,dist(u,Y)+dist(v,Y));
ans=min(ans,dist(u,X)+dist(v,Y)+Z);
ans=min(ans,dist(u,Y)+dist(v,X)+Z);
printf("%lld\n",ans);
}
}
}
return ;
}

HDU - 6393 Traffic Network in Numazu (LCA+RMQ+树状数组)的更多相关文章

  1. POJ 2763 (LCA +RMQ+树状数组 || 树链部分) 查询两点距离+修改边权

    题意: 知道了一颗有  n 个节点的树和树上每条边的权值,对应两种操作: 0 x        输出 当前节点到 x节点的最短距离,并移动到 x 节点位置 1 x val   把第 x 条边的权值改为 ...

  2. HDU - 6393 Traffic Network in Numazu (基环树+树链剖分/LCA)

    题意:给定一个带权边无向基环树,有两种操作,一种是改变某个边的权值,另一种是询问两点间的最短路径. 可以对环进行缩点,以环为根建立一棵新树,并记录与环相连的所有点和环上的哪个点相连,将路径分为环外和环 ...

  3. UESTC 912 树上的距离 --LCA+RMQ+树状数组

    1.易知,树上两点的距离dis[u][v] = D[u]+D[v]-2*D[lca(u,v)] (D为节点到根节点的距离) 2.某条边<u,v>权值一旦改变,将会影响所有以v为根的子树上的 ...

  4. POJ - 2763 Housewife Wind (树链剖分/ LCA+RMQ+树状数组)

    题意:有一棵树,每条边给定初始权值.一个人从s点出发.支持两种操作:修改一条边的权值:求从当前位置到点u的最短路径. 分析:就是在边可以修改的情况下求树上最短路.如果不带修改的话,用RMQ预处理LCA ...

  5. HDU6393(LCA + RMQ + 树状数组) n边图,两点最短距离 , 修改边权

    这道题的进阶版本 进阶版本 题意: 一个n个点,n条边的图,2中操作,1是将某条边的权值更改,2是询问两点的最短距离. 题解: 由于n个点,n条边,所以是树加一个环,将环上的边随意取出一条,就是1颗树 ...

  6. HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6393 题意 给n个点和n条边的图,有两种操作,一种修改边权,另一种查询u到v的最短路. 分析 n个点和n条边,实 ...

  7. hdu 6393 Traffic Network in Numazu (树链剖分+线段树 基环树)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6393 思路:n个点,n条边,也就是基环树..因为只有一个环,我们可以把这个环断开,建一个新的点n+1与之相 ...

  8. Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)

    Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...

  9. HDU 5293 Annoying problem 树形dp dfs序 树状数组 lca

    Annoying problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5293 Description Coco has a tree, w ...

随机推荐

  1. 第二百三十三节,Bootstrap表格和按钮

    Bootstrap表格和按钮 学习要点: 1.表格 2.按钮 本节课我们主要学习一下 Bootstrap 表格和按钮功能,通过内置的 CSS 定义,显示各 种丰富的效果. 一.表格 Bootstrap ...

  2. ubuntu16.04主题美化和软件推荐(转载)

    从这里转载!转载!转载! http://blog.csdn.net/terence1212/article/details/52270210

  3. AWS系列-申请Redis

    1.1 打开aws控制台,可以直接搜索redis 1.2 进入redis控制面板 点击启动缓存集群(这个只是启动创建的意思,不是启动下面创建好的node.我也不懂为啥翻译过来是这个意思...) 1.3 ...

  4. thrift框架总结,可伸缩的跨语言服务开发框架

    thrift框架总结,可伸缩的跨语言服务开发框架 前言: 目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等.其 ...

  5. Python全栈day26-27(面向对象进阶)

    参考 http://www.cnblogs.com/linhaifeng/articles/6204014.html 1,什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访 ...

  6. php 问题及原因总结

    1.php 加水印时出现问题的原因 :或许某个参数输入错误,导致页面一点反应都没有.

  7. Chomsky_hierarchy

      Grammar Languages Automaton Production rules (constraints) Type-0 Recursively enumerable Turing ma ...

  8. 2015-03-22——js常用的String方法

    String string.charAt(pos);  //返回字符串中pos位置处的字符.如果pos小于0或大于等于string.length返回空字符串.模拟实现:Function.prototy ...

  9. JS不改HTML任何代码就达到动态效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DT ...

  10. 1.Oracle数据库查看用户锁表和对表解锁的sql语句

    ① 查看用户锁表 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.lock ...