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

  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. 【BZOJ】3479: [Usaco2014 Mar]Watering the Fields(kruskal)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3479 这个还用说吗.... #include <cstdio> #include < ...

  2. hdu 3001(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 思路:这道题类似于TSP问题,只不过题目中说明每个城市至少要走一次,至多走2次,因此要用到三进制 ...

  3. Linux严格区分大小写

    虚拟机上安装了MySQL,使用rpm -qa | grep mysql查询时却未找到安装的mysql,后面才发现Linux严格区分大小写,正确的查询命令应该为rpm -qa | grep MySQL, ...

  4. 在 App Store 三年學到的 13 件事(下)

    博文转载至 http://blog.csdn.net/iunion/article/details/18959801     Steven Shen,曾經寫過一本書,也翻過一本書,開發 iOS app ...

  5. python 保存csv文件

    利用pandas库, 将numpy的array数据保存成csv格式的文件: import pandas as pd import numpy as np data = pd.read_csv('C:\ ...

  6. AI篇6====>第一讲

    1.人工智能 小米:小爱 百度:AI云平台 科大讯飞AI平台 2.百度语音合成 # Author: studybrother sun from aip import AipSpeech #从文本到声音 ...

  7. a标签的href和onclick

    1.链接的onclick事件被先执行,href的事件后执行 2.就今天遇到的问题说一下,通过a标签的onclick事件实现点击后定位到指定的div,或者是执行其他函数(比如弹出artdialog等), ...

  8. Windows服务的调试

    1.服务为其他程序调用的情况:首先停止服务,在项目中设置断点,重新启动服务,点击项目中工具,附加到进程,运行调用服务的程序,即可进入之前设置的断点,进而进行调试. 2.服务内方法为自动执行的情况:首先 ...

  9. js身份证号有效性验证

    1.简述 最近做的系统有用到实名验证的,起初对于用户身份证号只是简单地使用正则表达式进行验证, 很多无效的身份证号就成了漏网之鱼. 导致后台存表里很多无效的身份证号,随便输入用户名和身份证号就可以实名 ...

  10. 字符串 (string)与字节数组(byte[])之间的转换

    string str = "abc" //字符串转成编码为GB2312的byte[] byte[] pData =System.Text.Encoding.GetEncoding( ...