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

思路:n个点,n条边,也就是基环树。。因为只有一个环,我们可以把这个环断开,建一个新的点n+1与之相连,然后就按照树链剖分求边权的方法分类讨论下,过不过这条被分开的边,一共有三种情况取值最小的。

实现代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define ll long long
  6. #define mid int m = (l + r) >> 1
  7. const int M = 1e5+;
  8. int cnt,cnt1,head[M],fa[M],dep[M],son[M],siz[M],top[M],tid[M],n,q,vis[M];
  9. ll val[M];
  10. ll sum[M<<];
  11. struct node{
  12. int to,next;
  13. ll val;
  14. }e[M];
  15.  
  16. struct node1{
  17. int u,v;
  18. ll val;
  19. }a[M];
  20. void add(int u,int v){
  21. e[++cnt].to = v;e[cnt].next = head[u];head[u] = cnt;
  22. }
  23.  
  24. void dfs1(int u,int faz,int deep){
  25. dep[u] = deep;
  26. fa[u] = faz;
  27. siz[u] = ;
  28. for(int i = head[u];i;i=e[i].next){
  29. int v = e[i].to;
  30. if(v == fa[u]) continue;
  31. dfs1(v,u,deep+);
  32. siz[u] += siz[v];
  33. if(siz[v] > siz[son[u]]||son[u]==-)
  34. son[u] = v;
  35. }
  36. }
  37.  
  38. void dfs2(int u,int t){
  39. top[u] = t;
  40. tid[u] = ++cnt1;
  41. if(son[u] == -) return ;
  42. dfs2(son[u],t);
  43. for(int i = head[u];i;i=e[i].next){
  44. int v = e[i].to;
  45. if(v != fa[u]&&v != son[u])
  46. dfs2(v,v);
  47.  
  48. }
  49. }
  50.  
  51. void pushup(int rt){
  52. sum[rt] = sum[rt<<] + sum[rt<<|];
  53. }
  54.  
  55. void build(int l,int r,int rt){
  56. if(l == r){
  57. sum[rt] = val[l];
  58. return ;
  59. }
  60. mid;
  61. build(lson); build(rson);
  62. pushup(rt);
  63. }
  64.  
  65. void update(int p,ll c,int l,int r,int rt){
  66. if(l == r){
  67. sum[rt] = c;
  68. return ;
  69. }
  70. mid;
  71. if(p <= m) update(p,c,lson);
  72. else update(p,c,rson);
  73. pushup(rt);
  74. }
  75.  
  76. ll query(int L,int R,int l,int r,int rt){
  77. if(L <= l&&R >= r) return sum[rt];
  78. mid;
  79. ll ret = ;
  80. if(L <= m) ret += query(L,R,lson);
  81. if(R > m) ret += query(L,R,rson);
  82. return ret;
  83. }
  84.  
  85. /*void ct(int l,int r,int rt){
  86. if(l == r){
  87. cout<<sum[rt]<<" ";
  88. return ;
  89. }
  90. mid;
  91. ct(lson); ct(rson);
  92. }*/
  93.  
  94. ll solve(int x,int y){
  95. int fx = top[x],fy = top[y];
  96. ll ans = ;
  97. while(fx != fy){
  98. if(dep[fx] < dep[fy]) swap(fx,fy),swap(x,y);
  99. if(fx == ) ans += query(tid[fx]+,tid[x],,n+,);
  100. else ans += query(tid[fx],tid[x],,n+,);
  101. // cout<<x<<" "<<fx<<" "<<ans<<endl;
  102. x = fa[fx]; fx = top[x];
  103. }
  104. if(x == y) return ans;
  105. if(dep[x] > dep[y]) swap(x,y);
  106. ans += query(tid[son[x]],tid[y],,n+,);
  107. return ans;
  108. }
  109.  
  110. void init(){
  111. cnt = cnt1 = ;
  112. memset(son,-,sizeof(son));
  113. memset(head,,sizeof(head));
  114. memset(vis,,sizeof(vis));
  115. }
  116.  
  117. int main()
  118. {
  119. int t;
  120. scanf("%d",&t);
  121. while(t--){
  122. scanf("%d%d",&n,&q);
  123. init();
  124. int tx,ty = n+;
  125. for(int i = ;i <= n;i ++){
  126. scanf("%d%d%lld",&a[i].u,&a[i].v,&a[i].val);
  127. if(vis[a[i].u]&&vis[a[i].v]){
  128. tx = a[i].u;
  129. a[i].u = n+;
  130. }
  131. vis[a[i].u] = vis[a[i].v] = ;
  132. add(a[i].u,a[i].v);
  133. add(a[i].v,a[i].u);
  134. }
  135. // cout<<"jsjd: "<<tx<<" "<<ty<<endl;
  136. dfs1(,,);
  137. dfs2(,);
  138. for(int i = ;i <= n;i ++){
  139. if(dep[a[i].u] < dep[a[i].v])swap(a[i].u,a[i].v);
  140. val[tid[a[i].u]] = a[i].val;
  141. }
  142. build(,n+,);
  143. // ct(1,n+1,1);cout<<endl;
  144. while(q--){
  145. int op,x,y;
  146. scanf("%d%d%d",&op,&x,&y);
  147. if(op == ) update(tid[a[x].u],y,,n+,);
  148. else{
  149. ll num = solve(x,tx)+solve(y,ty);
  150. ll num1 = solve(x,ty)+solve(y,tx);
  151. //cout<<"num: "<<num<<"num1 : "<<num1<<"solve "<<solve(x,y)<<endl;
  152. printf("%lld\n",min(solve(x,y),min(num,num1)));
  153. }
  154. }
  155. }
  156. return ;
  157. }

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

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

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

  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. [BZOJ1146][CTSC2008]网络管理Network(二分+树链剖分+线段树套平衡树)

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

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

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

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

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

  8. 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

    3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] ...

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

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

随机推荐

  1. 微软官方的Excel android 移动版的折腾

    微软官方的Excel android 移动版,有重大bug.害我折腾了一天多时间.最终确认是Excel自身的问题. 现象描述:手机上新建或是保存excel后.放到电脑上,不能打开.提示”Excel在B ...

  2. CF [2016-2017 ACM-ICPC CHINA-Final][GYM 101194 H] Great Cells

    很久以前做的一道思博题了,今天来补一补. 大致题意:在一个\(n*m\)的矩阵内填整数,数字在\([1,k]\)范围内.矩阵中某格的数为great number当且仅当与它同行同列的数字都严格比它小. ...

  3. AT2134 Zigzag MST

    题面 题解 这个题目主要是连边很奇怪,但是我们可以发现一个性质:权值是递增的. 于是像下图的连边:(加边方式为\((A_1, B_1, 1)\)) 其实可以等价于如下连边: 于是我们将其变成了在环上连 ...

  4. VS2017登陆不了,TFS无法连接成功的问题

    由于使用的win7 64位操作系统,重装系统以后,安装了vs2017,登陆不成功,https://auth.gfx.ms/16.000.27887.2/OldConvergedLogin_PCore. ...

  5. linux RPM manager

    RPM manage:rpm2cpio package_name | cpio -id #将一个rpm包解压至当前目录rpm -qi package_name #查看一个已安装的rpm包信息rpm - ...

  6. 如何新增一个ssh-key文件

    前言 由于在公司有一个sshkey 在用,用于绑定公司的git code 仓库.那么在家要连上git hub 仓库,就也需要一个 ssh key .为了避免公司信息外露,所以还是新增一个ssh key ...

  7. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C-Bracket Subsequence

    #include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...

  8. linux内核分析程序破解实践报告

  9. 基于SSH框架的在线考勤系统开发的质量属性

    我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...

  10. 常见IP端口

    21端口:21端口主要用于FTP(File Transfer Protocol,文件传输协议)服务. 23端口:23端口主要用于Telnet(远程登录)服务,是Internet上普遍采用的登录和仿真程 ...