HDU-6393 Traffic Network in Numazu
题意:给你一个n边n点的无向连通图,两个操作,操作一改变某个边的权值,操作二查询某两个点之间的路径长度。
题解:随便删掉环上一条边搞一棵树出来,因为两点间距离是两点各自到根的距离之和减去2*lca两点到根的距离。
所以修改操作就变为维护点到根这条链上的权值,差分一下 采用树状数组维护。
查询的时候就是用删掉那条边和不用两种情况,比较一下大小就好了。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
int E[N],dfn[N],F[N],L[N],R[N],deep[N],inv[N],f[N][],to[N<<],w[N<<],nxt[N<<],H[N];
int W,X,Y,n,T,m,Q,x,y,z,tar,tot,cnt;
long long C[N];
void add(int u,int v,int z){
to[tot]=v,w[tot]=z,nxt[tot]=H[u],H[u]=tot++;
}
void dfs(int u,int fa,int deepth){
dfn[u]=L[u]=++cnt;
deep[u]=deepth;
inv[cnt]=u;
for(int i=H[u];~i;i=nxt[i]){
int v=to[i];
if(v==fa) continue;
if(dfn[v]) {
tar=(i>>)+;
W=w[i];
X=u;
Y=v;
continue;
}
f[v][]=u;
F[v]=w[i];
E[(i>>)+]=v;
dfs(v,u,deepth+);
}
R[u]=cnt;
}
void modify(int u,int v){
for(;u<=n;u+=u&(-u)) C[u]+=v;
}
long long sum(int u){
long long ans=;
for(;u;u-=u&(-u)) ans+=C[u];
return ans;
}
void work(){
for(int i=;i<;++i) for(int j=;j<=n;++j) f[j][i]=f[f[j][i-]][i-];
}
int lca(int x,int y){
if(deep[x]<deep[y]) swap(x,y);
int dt=deep[x]-deep[y];
for(int i=;i<;++i) if(dt&(<<i)) x=f[x][i];
if(x==y) return x;
for(int i=;i>=;--i) if(f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][];
}
long long dist(int x,int y){
return sum(dfn[x])+sum(dfn[y])-2LL*(sum(dfn[lca(x,y)]));
}
int main(){
for(scanf("%d",&T);T--;){
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i) H[i]=-,dfn[i]=C[i]=;
tot=cnt=;
for(int i=;i<=n;++i){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
dfs(,,);
work();
for(int i=;i<=n;++i) {
modify(L[inv[i]],F[inv[i]]);
modify(R[inv[i]]+,-F[inv[i]]);
}
while(m--){
scanf("%d%d%d",&x,&y,&z);
if(x==) {
if(tar==y) W=z;
else {
int i=E[y];
modify(L[i],z-F[i]);
modify(R[i]+,-z+F[i]);
F[i]=z;
}
}
else {
long long ans=dist(y,z);
ans=min(ans,dist(y,X)+dist(z,Y)+W);
ans=min(ans,dist(z,X)+dist(y,Y)+W);
printf("%lld\n",ans);
}
}
}
}
HDU-6393 Traffic Network in Numazu的更多相关文章
- HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)
http://acm.hdu.edu.cn/showproblem.php?pid=6393 题意 给n个点和n条边的图,有两种操作,一种修改边权,另一种查询u到v的最短路. 分析 n个点和n条边,实 ...
- hdu 6393 Traffic Network in Numazu (树链剖分+线段树 基环树)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6393 思路:n个点,n条边,也就是基环树..因为只有一个环,我们可以把这个环断开,建一个新的点n+1与之相 ...
- HDU - 6393 Traffic Network in Numazu (LCA+RMQ+树状数组)
这道题相当于将这两题结合: http://poj.org/problem?id=2763 http://codeforces.com/gym/101808/problem/K 题意:有N各点N条边的带 ...
- HDU - 6393 Traffic Network in Numazu (基环树+树链剖分/LCA)
题意:给定一个带权边无向基环树,有两种操作,一种是改变某个边的权值,另一种是询问两点间的最短路径. 可以对环进行缩点,以环为根建立一棵新树,并记录与环相连的所有点和环上的哪个点相连,将路径分为环外和环 ...
- Traffic Network in Numazu
Traffic Network in Numazu 题目描述 Chika is elected mayor of Numazu. She needs to manage the traffic in ...
- HDU contest808 ACM多校第7场 Problem - 1008: Traffic Network in Numazu
首先嘚瑟一下这场比赛的排名:59 (第一次看到这么多 √ emmmm) 好了进入正文QAQ ...这道题啊,思路很清晰啊. 首先你看到树上路径边权和,然后还带修改,不是显然可以想到 树剖+线段树 维护 ...
- hdu6393 Traffic Network in Numazu 树链剖分
题目传送门 题意:给出n个点n条边的无向带权图,再给出两种操作,操作1是将第x条边的边权修改为y,操作2是询问点x到点y的最短路径. 思路:如果是n个点n-1条边,题目就变成了树,修改边权和询问最短路 ...
- hdu6393Traffic Network in Numazu【树状数组】【LCA】
Traffic Network in Numazu Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (J ...
- Method for finding shortest path to destination in traffic network using Dijkstra algorithm or Floyd-warshall algorithm
A method is presented for finding a shortest path from a starting place to a destination place in a ...
随机推荐
- google proto buf学习
2019独角兽企业重金招聘Python工程师标准>>> protobuf是Google开发的一个序列化框架,类似XML,JSON,基于二进制,比传统的XML表示同样一段内容要短小得多 ...
- k8s namespace限制调研
1.创建namespace gpu 2.增加限制 [root@tensorflow1 gpu-namespace]# cat compute-resources.yaml apiVersion: v1 ...
- android自定义View&自定义ViewGroup(上)
一般自定义view需要重写的方法 void onMeasure(int widthMeasureSpec, int heightMeasureSpec) void onSizeChanged(int ...
- Jaba_Web--JDBC 删除记录操作模板
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- codeforce 270C Magical Boxes
C. Magical Boxes Emuskald is a well-known illusionist. One of his trademark tricks involves a set of ...
- P3588 【[POI2015]PUS】(线段树优化建边)
P3588 [[POI2015]PUS] 终于有个能让我一遍过的题了,写篇题解纪念一下 给定长度为n的序列和其中部分已知的数,还有m个大小关系:区间\([l,r]\)中,有k个给定的数比剩下的\(r- ...
- MySQL命令3
连接 mysql -u username -p 查看进程 SHOW processlist
- libevent(三)event_base
libevent能够处理三种事件: I/O.定时器.信号. event_base 统一管理所有事件. struct event_base { const struct eventop *evsel; ...
- Python基础02 变量
Python中的变量有两个特点: 1. 无需声明 a = 1 2. 不与类型绑定 a = 1 a = 'hello world' 变量名只是内存中具体对象的一个引用(reference). 对于 a ...
- Spring官网阅读(二)(依赖注入及方法注入)
上篇文章我们学习了官网中的1.2,1.3两小节,主要是涉及了容器,以及Spring实例化对象的一些知识.这篇文章我们继续学习Spring官网,主要是针对1.4小节,主要涉及到Spring的依赖注入.虽 ...