【BZOJ1576】[Usaco2009 Jan]安全路经Travel

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
输出解释:
跟题中例子相同

题解: 先求出最短路径树,然后我们统计每条非树边对每个点的影响。一条非树边可以更新它覆盖的所有点,如果这条边(x,y,len)覆盖了z,那么ans[z]=min(ans[z],dis[x]+dis[y]+len-dis[z]),因为dis[z]是确定的,所以我们维护链上的dis[x]+dis[y]+len的最小值即可。

如何维护?树剖+线段树,倍增,都是不错的方案,当然有更巧的。将所有非树边按dis[x]+dis[y]+len从小到大排序,然后用并查集维护所有没被更新的点,暴力更新路径上没被更新的点即可。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <queue>
  6. #include <utility>
  7. #define mp(A,B) make_pair(A,B)
  8. using namespace std;
  9. const int maxn=100010;
  10. int n,m,cnt;
  11. int to[maxn<<2],next[maxn<<2],val[maxn<<2],head[maxn],dis[maxn],fa[maxn],pre[maxn];
  12. int f[maxn],s[maxn],ans[maxn];
  13. bool vis[maxn];
  14. priority_queue<pair<int,int> > q;
  15. struct edge
  16. {
  17. int a,b,v;
  18. bool ont;
  19. }p[maxn<<1];
  20. inline char nc()
  21. {
  22. static char buf[100000],*p1=buf,*p2=buf;
  23. return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
  24. }
  25. inline int rd()
  26. {
  27. int ret=0,f=1; char gc=nc();
  28. while(!isdigit(gc)) {if(gc=='-') f=-f; gc=nc();}
  29. while(isdigit(gc)) ret=ret*10+gc-'0',gc=nc();
  30. return ret*f;
  31. }
  32. inline void add(int a,int b,int c)
  33. {
  34. to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;
  35. }
  36. bool cmp(const edge &a,const edge &b)
  37. {
  38. return a.v<b.v;
  39. }
  40. int find(int x)
  41. {
  42. return (f[x]==x)?x:(f[x]=find(f[x]));
  43. }
  44. int main()
  45. {
  46. n=rd(),m=rd();
  47. memset(head,-1,sizeof(head));
  48. register int i,u,a,b;
  49. for(i=1;i<=m;i++) p[i].a=rd(),p[i].b=rd(),p[i].v=rd(),add(p[i].a,p[i].b,p[i].v),add(p[i].b,p[i].a,p[i].v);
  50. memset(dis,0x3f,sizeof(dis));
  51. dis[1]=0,q.push(mp(0,1));
  52. while(!q.empty())
  53. {
  54. u=q.top().second,q.pop();
  55. if(vis[u]) continue;
  56. vis[u]=1;
  57. for(i=head[u];i!=-1;i=next[i]) if(dis[to[i]]>dis[u]+val[i])
  58. fa[to[i]]=u,pre[to[i]]=(i>>1)+1,dis[to[i]]=dis[u]+val[i],q.push(mp(-dis[to[i]],to[i]));
  59. }
  60. for(i=1;i<=n;i++) f[i]=i,p[pre[i]].ont=1;
  61. for(i=1;i<=m;i++) p[i].v+=dis[p[i].a]+dis[p[i].b];
  62. sort(p+1,p+m+1,cmp);
  63. for(i=1;i<=m;i++) if(!p[i].ont)
  64. {
  65. a=find(p[i].a),b=find(p[i].b);
  66. while(a!=b)
  67. {
  68. if(dis[a]<dis[b]) swap(a,b);
  69. ans[a]=p[i].v-dis[a],f[a]=fa[a],a=find(f[a]);
  70. }
  71. }
  72. for(i=2;i<=n;i++) printf("%d\n",(!ans[i])?-1:ans[i]);
  73. return 0;
  74. }

【BZOJ1576】[Usaco2009 Jan]安全路经Travel 最短路+并查集的更多相关文章

  1. BZOJ1576: [Usaco2009 Jan]安全路经Travel(最短路 并查集)

    题意 给你一张无向图,保证从1号点到每个点的最短路唯一.对于每个点求出删掉号点到它的最短路上的最后一条边(就是这条路径上与他自己相连的那条边)后1号点到它的最短路的长度 Sol emmm,考场上想了个 ...

  2. BZOJ.1576.[Usaco2009 Jan]安全路经Travel(树形DP 并查集)

    题目链接 BZOJ 洛谷 先求最短路树.考虑每一条非树边(u,v,len),设w=LCA(u,v),这条边会对w->v上的点x(x!=w)有dis[u]+dis[v]-dis[x]+len的距离 ...

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

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

  4. BZOJ1576 [Usaco2009 Jan]安全路经Travel

    首先用Dijkstra做出最短路生成树,设dis[p]为1到p点的最短路长度 对于一条不在生成树上的边u -> v,不妨设fa为u.v的lca 则一fa到v的路径上的任意点x都可以由u达到,走的 ...

  5. BZOJ1576: [Usaco2009 Jan]安全路经Travel(树链剖分)

    Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数 ...

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

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

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

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

  8. bzoj 1576: [Usaco2009 Jan]安全路经Travel——并查集+dijkstra

    Description Input * 第一行: 两个空格分开的数, N和M * 第2..M+1行: 三个空格分开的数a_i, b_i,和t_i Output * 第1..N-1行: 第i行包含一个数 ...

  9. BZOJ 1576: [Usaco2009 Jan]安全路经Travel

    日常自闭半小时后看题解,太弱了qwq. 感觉这道题还是比较难的,解法十分巧妙,不容易想到. 首先题目说了起点到每个点的最短路都是唯一的,那么对这个图求最短路图必定是一棵树,而且这棵树是唯一的. 那么我 ...

随机推荐

  1. scott权限

    有时scott数据被破坏了  可以回复 以下为 安装路径 dos下   @G:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\scott. ...

  2. java基础讲解14-----IO

    package com.io; import java.io.File;import java.io.IOException; public class IoClass {        /**   ...

  3. jQuery Growl 插件(消息提醒)

    jQuery Growl 插件(消息提醒) 允许您很容易地在一个覆盖层显示反馈消息.消息会在一段时间后自动消失,不需要单击"确定"按钮等.用户也可以通过移动鼠标或点击关闭按钮加快隐 ...

  4. vue TypeError: Cannot read property 'length' of undefined 问题解决思路

    上图中是我在接手一个项目的时候,出现的一个关于数组的 bug,但是从上图来看,其实报错是不清楚的,只能从报错信息上看出来是 /src/page/waybill/waybill_form.vue 这个 ...

  5. [Oracle] enq: TX - row lock contention 优化案例

    依据开发反馈.近期每天早上7:30应用会报警.应用的日志显示数据库连接池满了.新的连接被拒绝. 首先.我做了ASH报告(报告区间:7:25 ~ 7:35),从ASH的等待事件发现enq: TX - r ...

  6. ubuntu系统安装nginx出现的错误(依赖环境没有安装完)

    报错信息: error: the HTTP image filter module requires the GD library. 编译参数:(或源安装) ./configure --prefix= ...

  7. Decoration1:Spring-boot基础实现

    前段时间发布的Traveller项目,花费了不少精力,但是效果并不如意,根源在于瀑布式的开发思想不适合这种独立的学习项目.在项目初始就规划一个全面的web系统,,因为预设了一个前景,在心理上会想尽快看 ...

  8. QT界面 理解QStyle和QStyleOption以及QStyleFactory

    QStyleOption类和QStyle类简介 QStyleOption类存储QStyle函数使用的参数.QStyleOption及其子类包含了QStyle函数绘制图形元素所需的所有信息. 由于性能原 ...

  9. Compiler Error C2872: ambiguous symbol

    参考资料:http://blog.csdn.net/greytree/article/details/354530 刚才写的程序报错ERROR C2872(CL.exe)原因很简单 ZThread有定 ...

  10. Unity3D 5中增加WebGL 播放插件

    http://www.csdn.net/article/2014-03-18/2818822-Unity-5-game-engine 其实我是搞3d的,这篇文章里所有的术语看了都有很强的亲切感. Un ...