Description

Input

* 第一行: 两个空格分开的数, N和M

* 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i

Output

* 第1..N-1行: 第i行包含一个数:从牛棚_1到牛棚_i+1并且避免从牛棚1到牛棚i+1最短路经上最后一条牛路的最少的时间.如果这样的路经不存在,输出-1.

Sample Input

4 5
1 2 2
1 3 2
3 4 4
3 2 1
2 4 3

输入解释:

跟题中例子相同

Sample Output

3
3
6


3694只是给出最短路树而已,这里考虑1576怎么做。

首先求出最短路树。

设第i个点到根的路径长度为dis[i]。

考虑每条非树边<u,v>,有哪些牛牛可以经过这条边呢?

设l=lca(u,v),只有u到l和l到v路径上的点对应的牛才能享受到这条边。

考虑在子树内部的情况:最后一条边被割断因此走这条边不会减少到该点的距离。

考虑在外面的情况:由于到祖先的边被割断根本走不到u或v。

所以就变成了一个路径赋值取min,单点查询的问题。

树剖+线段树即可。

代码:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <ext/pb_ds/priority_queue.hpp>
  6. using namespace std;
  7. using namespace __gnu_pbds;
  8. #define N 200050
  9. #define M 200050
  10. #define inf 0x3f3f3f3f
  11. #define ls p<<1
  12. #define rs p<<1|1
  13. vector<int>v[N];
  14. vector<int>w[N];
  15. int head[N],to[M<<1],nxt[M<<1],val[M<<1],cnt=1,n,m,xx[M],yy[M],zz[M],vis[M],use[M],t[N<<2],cov[N<<2],dis[N];
  16. int dep[N],fa[N],top[N],son[N],siz[N],idx[N],turn[M<<1],ww[M<<1];
  17. __gnu_pbds::priority_queue<pair<int,int> >q;
  18. struct shulianpoufen {
  19. int head[N],to[N<<1],nxt[N<<1],cnt;
  20.  
  21. }T;
  22. inline void add(int u,int v,int w) {
  23. to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w;
  24. }
  25. void dij() {
  26. memset(dis,0x3f,sizeof(dis));
  27. dis[1]=0; q.push(make_pair(0,1));
  28. while(!q.empty()) {
  29. int x=q.top().second,i; q.pop();
  30. if(vis[x]) continue;
  31. vis[x]=1;
  32. for(i=head[x];i;i=nxt[i]) {
  33. if(dis[to[i]]+val[i]==dis[x]) {
  34. // printf("%d %d\n",x,to[i]);
  35. v[x].push_back(to[i]); w[x].push_back(val[i]);
  36. v[to[i]].push_back(x); w[to[i]].push_back(val[i]);
  37. use[i>>1]=1;
  38. }
  39. }
  40. for(i=head[x];i;i=nxt[i]) {
  41. if(dis[to[i]]>dis[x]+val[i]) {
  42. dis[to[i]]=dis[x]+val[i];
  43. q.push(make_pair(-dis[to[i]],to[i]));
  44. }
  45. }
  46. }
  47. }
  48. void dfs1(int x,int y) {
  49. fa[x]=y; dep[x]=dep[y]+1; siz[x]=1;
  50. int i;
  51. for(i=head[x];i;i=nxt[i]) {
  52. if(to[i]!=y) {
  53. dis[to[i]]=dis[x]+val[i];
  54. dfs1(to[i],x);
  55. siz[x]+=siz[to[i]]; if(siz[to[i]]>siz[son[x]]) son[x]=to[i];
  56. }
  57. }
  58. }
  59. void dfs2(int x,int t) {
  60. int i; top[x]=t; idx[x]=++idx[0];
  61. if(son[x]) dfs2(son[x],t);
  62. for(i=head[x];i;i=nxt[i]) {
  63. if(to[i]!=fa[x]&&to[i]!=son[x]) dfs2(to[i],to[i]);
  64. }
  65. }
  66. void pushdown(int p) {
  67. if(cov[p]!=inf) {
  68. int d=cov[p];
  69. t[ls]=min(t[ls],d); t[rs]=min(t[rs],d);
  70. cov[ls]=min(cov[ls],d); cov[rs]=min(cov[rs],d);
  71. cov[p]=inf;
  72. }
  73. }
  74. void update(int l,int r,int x,int y,int v,int p) {
  75. if(x<=l&&y>=r) {
  76. t[p]=min(t[p],v); cov[p]=min(cov[p],v); return ;
  77. }
  78. pushdown(p);
  79. int mid=(l+r)>>1;
  80. if(x<=mid) update(l,mid,x,y,v,ls);
  81. if(y>mid) update(mid+1,r,x,y,v,rs);
  82. t[p]=min(t[ls],t[rs]);
  83. }
  84. int query(int l,int r,int x,int p) {
  85. if(l==r) return t[p];
  86. pushdown(p);
  87. int mid=(l+r)>>1;
  88. if(x<=mid) return query(l,mid,x,ls);
  89. else return query(mid+1,r,x,rs);
  90. }
  91. void solve() {
  92. dfs1(1,1); dfs2(1,0);
  93. memset(t,0x3f,sizeof(t));
  94. memset(cov,0x3f,sizeof(cov));
  95. int i;
  96. for(i=1;i<=m;i++) {
  97. if(!use[i]) {
  98. int x=xx[i],y=yy[i],z=zz[i]+dis[x]+dis[y];
  99. while(top[x]!=top[y]) {
  100. if(dep[top[x]]>dep[top[y]]) swap(x,y);
  101. update(1,n,idx[top[y]],idx[y],z,1);
  102. y=fa[top[y]];
  103. }
  104. if(dep[x]<dep[y]) swap(x,y);
  105. if(x!=y) update(1,n,idx[y]+1,idx[x],z,1);
  106. }
  107. }
  108. for(i=2;i<=n;i++) {
  109. int tmp=query(1,n,idx[i],1);
  110. if(tmp==inf) puts("-1");
  111. else {
  112. printf("%d\n",tmp-dis[i]);
  113. }
  114. }
  115. }
  116. int main() {
  117. scanf("%d%d",&n,&m);
  118. int i,j;
  119. for(i=1;i<=m;i++) {
  120. scanf("%d%d%d",&xx[i],&yy[i],&zz[i]);
  121. add(xx[i],yy[i],zz[i]); add(yy[i],xx[i],zz[i]);
  122. }
  123. dij();
  124. memset(head,0,sizeof(head)); cnt=0;
  125. for(i=1;i<=n;i++) {
  126. for(j=0;j<v[i].size();j++) add(v[i][j],i,w[i][j]);
  127. }
  128. solve();
  129. }

BZOJ_1576_[Usaco2009 Jan]安全路经Travel&&BZOJ_3694_最短路_树链剖分+线段树的更多相关文章

  1. hdu5893 List wants to travel(树链剖分+线段树)

    Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...

  2. [Usaco2009 Jan]安全路经Travel BZOJ1576 Dijkstra+树链剖分+线段树

    分析: Dijkstra求最短路树,在最短路树上进行操作,详情可见上一篇博客:http://www.cnblogs.com/Winniechen/p/9042937.html 我觉得这个东西不压行写出 ...

  3. [BZOJ1576] [Usaco2009 Jan]安全路经Travel(堆优化dijk + (并查集 || 树剖))

    传送门 蒟蒻我原本还想着跑两边spfa,发现不行,就gg了. 首先这道题卡spfa,所以需要用堆优化的dijkstra求出最短路径 因为题目中说了,保证最短路径有且只有一条,所以可以通过dfs求出最短 ...

  4. bzoj 1576: [Usaco2009 Jan]安全路经Travel【spfa+树链剖分+线段树】

    这几天写USACO水题脑子锈住了--上来就贪心,一交就WA 事实上这个是一个叫最短路树的东西,因为能保证只有一条最短路,所以所有最短路合起来是一棵以1为根的树,并且在这棵树上,每个点被精灵占据的路是它 ...

  5. HDU 5893 List wants to travel(树链剖分+线段树)

    题目链接 HDU5893 $2016$年$ICPC$沈阳网络赛的$B$题.这道题其和 BZOJ2243 基本一样 那道题我也写了题解 点这里 两道题的区别就是$BZOJ$这题是点的权值,这道题是边权. ...

  6. bzoj 1576 [Usaco2009 Jan]安全路经Travel(树链剖分,线段树)

    [题意] 给定一个无向图,找到1-i所有的次短路经,要求与最短路径的最后一条边不重叠. [思路] 首先用dijkstra算法构造以1为根的最短路树. 将一条无向边看作两条有向边,考察一条不在最短路树上 ...

  7. bzoj 1576: [Usaco2009 Jan]安全路经Travel 树链剖分

    1576: [Usaco2009 Jan]安全路经Travel Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 665  Solved: 227[Sub ...

  8. 【BZOJ1576】[Usaco2009 Jan]安全路经Travel 最短路+并查集

    [BZOJ1576][Usaco2009 Jan]安全路经Travel Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, ...

  9. 【思维题 并查集 图论】bzoj1576: [Usaco2009 Jan]安全路经Travel

    有趣的思考题 Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第 ...

随机推荐

  1. 零基础入门学习Python(12)--列表:一个打了激素的数组(3)

    前言 这节课我们继续谈一下Python列表一些知识 知识点 Python常用操作符 比较操作符 >>> list1 = [123] >>> list2 = [234 ...

  2. java使用ant.jar解压缩文件

    ant.jar下载地址http://ant.apache.org/bindownload.cgi 压缩文件代码: import org.apache.tools.ant.Project; import ...

  3. python视频 神经网络 Tensorflow

    python视频 神经网络 Tensorflow 模块 视频教程 (带源码) 所属网站分类: 资源下载 > python视频教程 作者:smile 链接:http://www.pythonhei ...

  4. url方法使用与单例模式

    一.url方法使用 from django.contrib import admin from django.urls import path, include from django.conf.ur ...

  5. 【转】Java的path,classpath,java_home环境变量的配置与具体含义

    对于一个Java初学者来说,第一步要做的是安装jdk并配置环境变量,一般按照书上或者网上的步骤,一步步照着做就行了,但是对于初学者来说,很多问题没有解决,比如为什么很多配置方法各不相同,却都能够配置成 ...

  6. 592. Fraction Addition and Subtraction

    Problem statement: Given a string representing an expression of fraction addition and subtraction, y ...

  7. hdu 361B

    #include<stdio.h> int a[100100]; int main() { int n,i,k; while(scanf("%d%d",&n,& ...

  8. csu - 1566: The Maze Makers (bfs)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1566 题意还是蛮难懂的,至少对于我来说,需要认真读题. 输入矩阵的每一个数字换成2进制后,顺时针围 ...

  9. 源码SDWebImage

    源码来源:https://github.com/rs/SDWebImage 版本: 3.7 SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类,以支持从远程服务器下载并 ...

  10. dtrace.org

    http://dtrace.org/blogs/rm/2016/09/15/turtles-on-the-wire-understanding-how-the-os-uses-the-modern-n ...