http://acm.hdu.edu.cn/showproblem.php?pid=6393

题意

给n个点和n条边的图,有两种操作,一种修改边权,另一种查询u到v的最短路。

分析

n个点和n条边,实际上是一棵树+一个环,如果仅仅是一棵树,那么这题就是树链剖分的模板题了。

对于环来说,可以考虑先把环中一条边提取出来,然后树链剖分,修改时用线段树,单点修改和区间求和。

查询时就考虑三种情况,u走树上到v,从u经过提取出来的边再到v(两种),取最小值。

至于取出环上一条边,用并查集搞搞。

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 2e5+; struct side {
int u,v,w;
int ne;
} s[maxn]; struct edge {
int l,r;
ll v;
} e[maxn<<]; int n,q;
int head[maxn],len;
int val[maxn],hold[maxn],pre[maxn];
int deep[maxn],fa[maxn],ve[maxn],son[maxn],top[maxn],p[maxn],fp[maxn],sz; void add(int u,int v,int w) {
s[len].u = u;
s[len].v = v;
s[len].w = w;
s[len].ne = head[u];
head[u] = len++;
} int find(int x) {
return pre[x] == x?x:pre[x] = find(pre[x]);
} void dfs1(int u,int p,int d) {
deep[u] = d;
fa[u] = p;
ve[u] = ;
son[u] = -;
for(int i = head[u]; i!= -; i = s[i].ne) {
if(s[i].v == p) continue;
val[s[i].v] = s[i].w; //把边权值赋给相连的点
hold[i>>] = s[i].v;//这条边的权值被哪个点掌握着
dfs1(s[i].v,u,d+);
ve[u]+= ve[s[i].v];
if(son[u] == -||ve[s[i].v]> ve[son[u]])
son[u] = s[i].v;
}
return ;
} void dfs2(int u,int sp) {
top[u] = sp;
p[u] = ++sz;
fp[p[u]] = u;
if(son[u] == -) return ;
dfs2(son[u],sp);
for(int i = head[u]; i!= -; i = s[i].ne) {
if(s[i].v == son[u]||s[i].v == fa[u]) continue;
dfs2(s[i].v,s[i].v);
}
return ;
} void build(int i,int l,int r) {
e[i].l = l;
e[i].r = r;
if(l == r) {
e[i].v = val[fp[l]];
return ;
} int mid = (l+r)>>;
build(i<<,l,mid);
build(i<<|,mid+,r);
e[i].v = e[i<<].v+e[i<<|].v;
} void modify(int i,int pos,int v) {
if(pos> e[i].r||pos< e[i].l) return ;
if(e[i].l == e[i].r) {
e[i].v = v;
return ;
}
modify(i<<,pos,v);
modify(i<<|,pos,v);
e[i].v = e[i<<].v+e[i<<|].v;
} ll query(int i,int l,int r) {
if(e[i].r< l||e[i].l> r) return ;
if(e[i].l>= l&&e[i].r<= r) return e[i].v;
return query(i<<,l,r)+query(i<<|,l,r);
} ll demand(int x,int y) {
int fx = top[x];
int fy = top[y];
ll ans = ;
while(fx!= fy) {
if(deep[fx]< deep[fy]) {
swap(fx,fy);
swap(x,y);
}
ans+= query(,p[fx],p[x]);
x = fa[fx];
fx = top[x];
}
if(x == y) return ans;
if(deep[x]> deep[y]) swap(x,y);
ans+= query(,p[son[x]],p[y]);
return ans;
} void init() {
sz = len = ;
mem(head,-);
for(int i = ; i<= n; i++) pre[i] = i;
} int main() {
int t;
cin>>t; while(t--) {
int su,sv,sc,ss;
scanf("%d %d",&n,&q);
init();
for(int i = ; i<= n; i++) {
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
int fx = find(u);
int fy = find(v); if(fx == fy) {
len+= ;
ss = i;
su = u;
sv = v;
sc = w;
continue;
} else
pre[fy] = fx;
add(u,v,w);
add(v,u,w);
} dfs1(,-,);
dfs2(,); build(,,n); while(q--) {
int o,x,y;
scanf("%d %d %d",&o,&x,&y);
if(o == ) {
x--;
if(x == ss) {
sc = y;
continue;
}
modify(,p[hold[x]],y);
} else {
ll ans;
ans = sc+min(demand(x,su)+demand(y,sv),demand(x,sv)+demand(y,su));
ans = min(ans,demand(x,y));
printf("%lld\n",ans);
}
}
}
return ;
}

HDU - 6393 Traffic Network in Numazu(树链剖分+基环树)的更多相关文章

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

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

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

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

  3. HDU - 6393 Traffic Network in Numazu (LCA+RMQ+树状数组)

    这道题相当于将这两题结合: http://poj.org/problem?id=2763 http://codeforces.com/gym/101808/problem/K 题意:有N各点N条边的带 ...

  4. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  5. HDU 6162 Ch's gift(树链剖分+线段树)

    题意: 已知树上的每个节点的值和节点之间的关系建成了一棵树,现在查询节点u到节点v的最短路径上的节点值在l到r之间的节点值的和. 思路: 用树链剖分将树映射到线段树上,线段树上维护3个值,max,mi ...

  6. [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)

    题意:树上单点修改,询问链上k大值. 思路: 1.DFS序+树状数组套主席树 首先按照套路,关于k大值的问题,肯定要上主席树,每个点维护一棵权值线段树记录它到根的信息. 关于询问,就是Que(u)+Q ...

  7. Aragorn's Story 树链剖分+线段树 && 树链剖分+树状数组

    Aragorn's Story 来源:http://www.fjutacm.com/Problem.jsp?pid=2710来源:http://acm.hdu.edu.cn/showproblem.p ...

  8. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  9. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

随机推荐

  1. 网络流24(san)题题解汇总

    开坑(烂尾预定 1.餐巾计划问题 题解 2.最小路径覆盖问题 题解 3.试题库问题 题解 4.[CTSC1999]家园 题解 5.骑士共存问题 题解 6.最长不下降子序列问题 题解 7.深海机器人问题 ...

  2. 【XSY1081】随机存储器 网络流

    题目描述 Bob有\(2^n\)字节的内存,编号为\([0,2^n-1)\).他想对每个字节的内存分别分配一个值.对于编号为\(i\)的内存,如果它被分配了一个值\(j(0\leq j<2^m) ...

  3. spring boot下MultipartHttpServletRequest如何提高上传文件大小的默认值

    前言: 上传下载功能算是一个非常常见的功能,如果使用MultipartHttpServletRequest来做上传功能. 不配置上传大小的话,默认是2M.在有些场景,这个肯定不能满足条件. 上传代码: ...

  4. django的RestFramework模块的源码分析

    一.APIView源码分析 查看源码的前提要知道,找函数方法必须先在自己的类中找,没有再往父类找,一层一层网上找,不能直接按ctrl点击 在我们自己定义的类中没有as_view方法的函数,所以肯定是继 ...

  5. 洛谷 P2622 关灯问题II(状压DP入门题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题解: 相关变量解释: int n,m; ];//a[i][j] : 第i个开关对第j个 ...

  6. appium 切换native/ webview,findby,还有页面元素定位一直小于0的问题的解决

    之前一直有个bug没有解决. 今天,终于解决了. 疑问过程: app是混合应用,项目做了H5优化之后,以前的用例执行总会失败,体现在原来的一个元素点击无反馈 排查原因:1.项目做了H5优化,2.测试的 ...

  7. node.js(小案例)_使用mongodb对学生信息列表优化

    一.前言 1.这篇文章主要对上一篇案列在操作增删改的时候使用mongodb进行优化 2.项目源码(包含上):https://github.com/4561231/crud-express-node.g ...

  8. php处理文件上传

    注意点: 1.<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" ...

  9. 三台机器之间ssh互信配置

    三台机器之间ssh互信配置 环境介绍:192.168.65.128    my1-222192.168.65.129  my2-223192.168.65.130    web224 # 步骤一:# ...

  10. 使用property为类中的数据添加行为

    对于面向对象编程特别重要的是,关注行为和数据的分离. 在这之前,先来讨论一些“坏”的面向对象理论,这些都告诉我们绝不要直接访问属性(如Java): class Color: def __init__( ...