死活想不到分层图emmm

基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为val/2,表示免了这条边的边权,然后答案就是第0层的s到k层的t的最短路,因为0权边总是从上一层连到下一层,所以到达k层就表示走了k条0权边

然后仔细观察这张图的特性,发现不同层之间的更新只有上一层通过val/2权边更新下一层,所以考虑单层更新,每一层都做一次spfa,然后跨层的时候用上一层跑过的最短路和0权边更新下一层

然后再给spfa加一个SLF优化即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cstring>
  5. #include<ctime>
  6. using namespace std;
  7. const int N=50005,inf=1e9;
  8. int n,m,k,h[N],cnt,dis[N],d[N];
  9. bool v[N];
  10. deque<int>q;
  11. struct qwe
  12. {
  13. int ne,no,to,va;
  14. }e[N<<2];
  15. int read()
  16. {
  17. int r=0,f=1;
  18. char p=getchar();
  19. while(p>'9'||p<'0')
  20. {
  21. if(p=='-')
  22. f=-1;
  23. p=getchar();
  24. }
  25. while(p>='0'&&p<='9')
  26. {
  27. r=r*10+p-48;
  28. p=getchar();
  29. }
  30. return r*f;
  31. }
  32. inline void add(int u,int v,int w)
  33. {
  34. cnt++;
  35. e[cnt].ne=h[u];
  36. e[cnt].no=u;
  37. e[cnt].to=v;
  38. e[cnt].va=w;
  39. h[u]=cnt;
  40. }
  41. void spfa()
  42. {
  43. while(!q.empty())
  44. {
  45. int u=q.front();
  46. q.pop_front();
  47. v[u]=0;
  48. for(int i=h[u];i;i=e[i].ne)
  49. if(dis[e[i].to]>dis[u]+e[i].va)
  50. {
  51. dis[e[i].to]=dis[u]+e[i].va;
  52. if(!v[e[i].to])
  53. {
  54. v[e[i].to]=1;
  55. if(!q.empty()&&dis[q.front()]>dis[e[i].to])
  56. q.push_front(e[i].to);
  57. else
  58. q.push_back(e[i].to);
  59. }
  60. }
  61. }
  62. }
  63. int main()
  64. {
  65. n=read(),m=read(),k=read();
  66. for(int i=1;i<=m;i++)
  67. {
  68. int x=read(),y=read(),z=read();
  69. add(x,y,z),add(y,x,z);
  70. // for(int j=0;j<=k;j++)
  71. // add(x+j*n,y+j*n,z),add(y+j*n,x+j*n,z);
  72. // for(int j=1;j<=k;j++)
  73. // add(x+(j-1)*n,y+j*n,0),add(y+(j-1)*n,x+j*n,0);
  74. }
  75. for(int i=1;i<=n;i++)
  76. dis[i]=inf;
  77. // clock_t st,ed;
  78. // st=clock();
  79. v[1]=1,dis[1]=0,q.push_back(1);
  80. spfa();
  81. for(int con=1;con<=k;con++)
  82. {
  83. for(int i=1;i<=n;i++)
  84. d[i]=inf;
  85. v[1]=1,dis[1]=0,q.push_back(1);
  86. for(int i=1;i<=cnt;i++)
  87. if(d[e[i].to]>dis[e[i].no]+e[i].va/2)
  88. {
  89. d[e[i].to]=dis[e[i].no]+e[i].va/2;
  90. if(!v[e[i].to])
  91. {
  92. v[e[i].to]=1;
  93. if(!q.empty()&&d[q.front()]>d[e[i].to])
  94. q.push_front(e[i].to);
  95. else
  96. q.push_back(e[i].to);
  97. }
  98. }
  99. for(int i=1;i<=n;i++)
  100. dis[i]=d[i];
  101. spfa();
  102. }
  103. // ed=clock();
  104. // cerr<<st<<" "<<ed<<" "<<ed-st<<endl;
  105. printf("%d\n",dis[n]);
  106. return 0;
  107. }

bzoj 2662: [BeiJing wc2012]冻结【分层图+spfa】的更多相关文章

  1. bzoj 2662 [BeiJing wc2012]冻结——分层图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2662 这种的都是分层图. #include<iostream> #include ...

  2. 【bzoj2662】[BeiJing wc2012]冻结 分层图Spfa

    原文地址:http://www.cnblogs.com/GXZlegend 题目描述 “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„ ...

  3. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路

    2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 647  Solved: 348[Submit][Sta ...

  4. BZOJ 2662: [BeiJing wc2012]冻结(最短路)

    这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. ---------------------------------------- ...

  5. [BZOJ] 2662: [BeiJing wc2012]冻结

    https://www.lydsy.com/JudgeOnline/problem.php?id=2662 第一次写分层图(捂脸) 一开始真的naive地建图了,T到飞起.. 可以省下建图的空间,直接 ...

  6. BZOJ2662[BeiJing wc2012]冻结——分层图最短路

    题目描述 “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„”     在这个愿望被实现以后的世界里,人们享受着魔法卡片(Spe ...

  7. bzoj2662 [BeiJing wc2012]冻结 ——分层图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2662 分层图: 我也不知道我写的是不是 bfs (dijkstra?). 代码如下: #in ...

  8. [bzoj2662 BeiJing wc2012] 冻结 (分层图+最短路)

    传送门 Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„&q ...

  9. bzoj 2763: [JLOI2011]飞行路线【分层图+spfa】

    为什么早年的题总是从0开始标号啊--又zz了一次WA 分层图的题只有这一个套路吧,建分层图,然后优化时间是分层跑spfa然后层与层之间单独跑即可 #include<iostream> #i ...

随机推荐

  1. Spring 事物注解属性

    @Transactional属性 . propagation 事物的传播属性 . isolation 事物的隔离属性 . readonly 设置只读属性 . timeout 设置超时属性 . roll ...

  2. prometheus监控linux系统

    安装node exporter 创建Systemd服务 #vim /etc/systemd/system/node_exporter.service[Unit]Description=mysql_ex ...

  3. c网购物车流程图

    1. 流程图 2. 流程介绍 1) 客人浏览模式下(未登录状态)加入购物车 这个时候回校验一下商品的可售数量,以及状态等等,校验成功后会保存到cookie和memcache,数据操作校验以memcac ...

  4. Spark 动态(统一)内存管理模型

    作者编辑:王玮,胡玉林 一.回顾 在前面的一篇文章中我们介绍了spark静态内存管理模式以及相关知识https://blog.csdn.net/anitinaj/article/details/809 ...

  5. 【BZOJ2301】Problem b(莫比乌斯反演)

    题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d, 且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 1≤n≤50000,1≤a≤b≤50000 ...

  6. JDBC实例代码

    以下内容引用自http://wiki.jikexueyuan.com/project/jdbc/sample-code.html: 前提: 1.在MySQL中创建数据表和增加模拟数据: DROP TA ...

  7. [TypeScript] Use TypeScript’s never Type for Exhaustiveness Checking

    TypeScript 2.0 introduced a new primitive type called never, the type of values that never occur. It ...

  8. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍

    WPF自学入门(十一)WPF MVVM模式Command命令   在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式 ...

  9. JAVA进阶-网络编程

    >通过套接字连接server Socket指代套接字 >读取随意站点的首页 --------- /** * @author Lean @date:2014-10-9 */ public c ...

  10. Android实战简易教程-第四十五枪(SlideSwitch-好看又有用的开关button)

    开关button也是在项目中经经常使用到的控件,github上有开源的项目,我们研究下它的用法: 1.SlideButton.java: /* * Copyright (C) 2015 Quinn C ...