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
—————————————————————————————————
由于最短路唯一,先求最短路径树,考虑非树边uv,它能使uv以上,lca以下的点多一种路径,长度为dis[u] + dis[v] + edge[i] - dis[x]。
因为dis[x]是常数 我们令这条非树边的值为val[i] = dis[u] + dis[v] + edge[i],我们只需对每个x,找出最小的val。
可以先按val排序,然后使用并查集压缩路径即可。
因为已经赋值过的点一定比现在解更优 所以防止多次算到一个点 我们可以把他们合并起来一起跳过
这道题不能写spfa会被卡QAQ dj快很多 spfa佳slf优化也很慢 勉强能过
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. const int N=1e5+,M=4e5+,inf=0x3f3f3f3f;
  7. int read(){
  8. int ans=,f=,c=getchar();
  9. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  10. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  11. return ans*f;
  12. }
  13. int n,m,ans[N];
  14. int f[N],fa[N];
  15. int find(int x){while(x!=f[x]) x=f[x]=f[f[x]]; return x;}
  16. int first[N],cnt,cntq;
  17. struct node{int from,to,next,w;}e[M],qs[M];
  18. bool cmp(node a,node b){return a.w<b.w;}
  19. void ins(int a,int b,int w){e[++cnt]=(node){a,b,first[a],w}; first[a]=cnt;}
  20. void insert(int a,int b,int w){ins(a,b,w); ins(b,a,w);}
  21. int dis[N],dep[N];
  22. struct Q{
  23. int d,pos;
  24. bool operator <(const Q& x)const{return x.d<d;}
  25. };
  26. priority_queue<Q>q;
  27. void dj(){
  28. memset(dis,0x3f,sizeof(dis));
  29. q.push((Q){,}); dis[]=;
  30. while(!q.empty()){
  31. Q p=q.top(); q.pop();
  32. if(p.d>dis[p.pos]) continue;
  33. int x=p.pos;
  34. for(int i=first[x];i;i=e[i].next){
  35. int now=e[i].to;
  36. if(dis[now]>dis[x]+e[i].w){
  37. dis[now]=dis[x]+e[i].w;
  38. dep[now]=dep[x]+;
  39. fa[now]=x;
  40. q.push((Q){dis[now],now});
  41. }
  42. }
  43. }
  44. }
  45. int main(){
  46. int x,y,w;
  47. n=read(); m=read();
  48. for(int i=;i<=n;i++) f[i]=i;
  49. for(int i=;i<=m;i++) x=read(),y=read(),w=read(),insert(x,y,w);
  50. dj();
  51. for(int i=;i<=cnt;i++){
  52. x=e[i].from; y=e[i].to;
  53. if(dep[x]<dep[y]) swap(x,y);
  54. if(dis[x]==dis[y]+e[i].w) continue;
  55. qs[++cntq]=(node){x,y,,dis[x]+dis[y]+e[i].w};
  56. }
  57. sort(qs+,qs++cntq,cmp);
  58. for(int i=;i<=cntq;i++){
  59. x=qs[i].from; y=qs[i].to;
  60. while(x!=y){
  61. if(dep[x]<dep[y]) swap(x,y);
  62. if(!ans[x]) ans[x]=qs[i].w-dis[x];
  63. x=f[x]=find(fa[x]); //printf("[%d]\n",x);
  64. }
  65. }
  66. for(int i=;i<=n;i++){
  67. if(!ans[i]) printf("-1\n");
  68. else printf("%d\n",ans[i]);
  69. }
  70. return ;
  71. }

bzoj 1576: [Usaco2009 Jan]安全路经Travel——并查集+dijkstra的更多相关文章

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

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

  2. [BZOJ 1576] [Usaco2009 Jan] 安全路经Travel 【树链剖分】

    题目链接: BZOJ - 1576 题目分析 首先Orz Hzwer的题解. 先使用 dijikstra 求出最短路径树. 那么对于一条不在最短路径树上的边 (u -> v, w) 我们可以先沿 ...

  3. 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的距离 ...

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

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

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

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

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

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

  7. 【BZOJ】1576 [Usaco2009 Jan]安全路经Travel

    [算法]最短路树+(树链剖分+线段树)||最短路树+并查集 [题解] 两种方法的思想是一样的,首先题目限制了最短路树唯一. 那么建出最短路树后,就是询问对于每个点断掉父边后重新找路径的最小值,其它路径 ...

  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. vs调试代码的时候断点无法命中

    https://blog.csdn.net/xxdddail/article/details/18696399 该链接提供的解决方案主要是如下图片:禁用 图片标记的这个选项即可:

  2. oracle12c 新建表空间

    第1步:创建临时表空间 create temporary tablespace jeeplus_temp tempfile 'D:\app\Administrator\virtual\product\ ...

  3. Linux-获得命令帮助man

    date:显示当前系统时间,修改时间 clock,hwclock:显示硬件时间 cal:calendar,查看日历 计时器靠晶体振荡器来完成计时 Linux: 实时时钟,rtc,real time c ...

  4. KVM web管理工具——WebVirtMgr(一)

    WebVirtMgr 介绍     WebVirtMgr采用几乎纯Python开发,其前端是基于Python的Django,后端是基于Libvirt的Python接口,将日常kvm的管理操作变的更加的 ...

  5. mysql分布式技术

    所有的分布式技术 dobble zokkiper ngix

  6. HDU 3269 P2P File Sharing System(模拟)(2009 Asia Ningbo Regional Contest)

    Problem Description Peer-to-peer(P2P) computing technology has been widely used on the Internet to e ...

  7. Android stateMachine分析

    StateMachine与State模式的详细介绍可以参考文章:Android学习 StateMachine与State模式 下面是我对于StateMachine的理解: 先了解下消息处理.看下Sta ...

  8. [GitHub] - Unity Timer

    https://github.com/akbiggs/UnityTimer#unity-timer Run actions after a delay in Unity3D. This library ...

  9. Xampp+Openfire+Spark的简单使用

    Openfire与Spark的简单实用 1.安装Openfire 百度云 提取码:uu11 2.查找路径 /usr/local/openfire 这时候需要将openfire的文件属性都设置为 可读可 ...

  10. 201621044079《Java程序设计》第二周学习总结

    Week02-Java基本语法与类库 1.本周学习总结 记录本周学习中的重点 尝试使用 原则:少而精,自己写.即使不超过5行也可,但请一定不要简单的复制粘贴 1.学习了Java的数据类型 int ch ...