Description

找出1~k短路的长度。
 

Solution

k短路的求解要用到A*算法

A*算法的启发式函数f(n)=g(n)+h(n)

g(n)是状态空间中搜索到n所花的实际代价

h(n)是n到结束状态最佳路径的估计代价

关于h(n)的选取,当h(n)<实际代价时,搜索慢但可出解;h(n)=实际代价时,正确率与效率最高;h(n)>实际代价,快但只能得到近似解。

但在k短路问题中,h(n)是可以选到准确值的,就是n到结束节点的最短路,预处理时从结束节点做一次单源最短路即可。

按广搜的方式扩展节点,每次优先扩展f(n)最小的节点。

第i次扩展到目标节点,代表找到了第i短路。

正确性什么的很好理解。

k短路关于A*部分代码很简洁,用优先队列维护。

这道题就是裸题,但这道题很丧病地让proirity_queueMLE,于是要手写堆。

让我这个几乎没手写过堆的STL狗QwQ

Code

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<queue>
  4. #include<cstring>
  5. using namespace std;
  6. const int N=5e3+,M=2e5+;
  7.  
  8. double d[N];
  9. int head[N],e[M],nxt[M],cnt;
  10. double w[M];
  11. int adde(int u,int v,double g){
  12. e[++cnt]=v;w[cnt]=g;nxt[cnt]=head[u];head[u]=cnt;
  13. }
  14. int _head[N],_e[M],_nxt[M],_cnt;
  15. double _w[M];
  16. int _adde(int u,int v,double g){
  17. _e[++_cnt]=v;_w[_cnt]=g;_nxt[_cnt]=_head[u];_head[u]=_cnt;
  18. }
  19. struct node{
  20. double f,g;
  21. int o;
  22. bool operator<(const node&a)
  23. const{return f<a.f;}
  24. };
  25. int n,m;
  26. double c;
  27.  
  28. queue<int>q;
  29. int inque[N];
  30. int spfa(){
  31. memset(d,,sizeof(d));
  32. d[n]=;
  33. inque[n]=;
  34. q.push(n);
  35.  
  36. while(!q.empty()){
  37. int u=q.front();q.pop();
  38. for(int i=_head[u];i;i=_nxt[i]){
  39. int v=_e[i];
  40. if(d[v]>d[u]+_w[i]){
  41. d[v]=d[u]+_w[i];
  42. if(!inque[v]){
  43. q.push(v);
  44. inque[v]=;
  45. }
  46. }
  47. }
  48. inque[u]=;
  49. }
  50. }
  51.  
  52. int ans,size;
  53. node Q[];
  54. int push(node x){
  55. int now,next;
  56. Q[++size]=x;
  57. now=size;
  58. while(now>){
  59. next=now>>;
  60. if(Q[next]<Q[now]) break;
  61. swap(Q[now],Q[next]);
  62. now=next;
  63. }
  64. }
  65. node pop(){
  66. int now,next;
  67. node ret;
  68. ret=Q[];
  69. Q[]=Q[size--];
  70. now=;
  71. while((now<<)<=size){
  72. next=now<<;
  73. if(next<size&&Q[next+]<Q[next]) next++;
  74. if(Q[now]<Q[next]) break;
  75. swap(Q[now],Q[next]);
  76. now=next;
  77. }
  78. return ret;
  79. }
  80. void Astar(){
  81. push((node){d[],,});
  82. while(size){
  83. node x=pop();
  84. for(int i=head[x.o];i;i=nxt[i]){
  85. int v=e[i];
  86. push((node){x.g+w[i]+d[v],x.g+w[i],v});
  87. }
  88. if(x.o==n){
  89. c-=x.f;
  90. if(c<) return;
  91. ans++;
  92. }
  93. }
  94. }
  95.  
  96. int main(){
  97. scanf("%d%d%lf",&n,&m,&c);
  98. int u,v; double g;
  99. for(int i=;i<=m;i++){
  100. scanf("%d%d%lf",&u,&v,&g);
  101. adde(u,v,g);
  102. _adde(v,u,g);
  103. }
  104.  
  105. spfa();
  106. Astar();
  107.  
  108. printf("%d\n",ans);
  109. return ;
  110. }
 

【k短路&A*算法】BZOJ1975: [Sdoi2010]魔法猪学院的更多相关文章

  1. bzoj1975: [Sdoi2010]魔法猪学院【k短路&A*算法】

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2446  Solved: 770[Submit][Statu ...

  2. [BZOJ1975][SDOI2010]魔法猪学院(k短路,A*)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2748  Solved: 883[Submit][Statu ...

  3. BZOJ1975 [Sdoi2010]魔法猪学院 k短路

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1975 题意概括 给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数. ...

  4. BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)

    对反图跑最短路求出每个点到终点的最短路径,令其为估价函数大力A*,第k次到达某个点即是找到了到达该点的非严格第k短路,因为估价函数总是不大于实际值.bzoj可能需要手写堆.正解是可持久化可并堆,至今是 ...

  5. BZOJ1975 [Sdoi2010]魔法猪学院

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  7. 洛谷P2483 Bzoj1975 [SDOI2010]魔法猪学院

    题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...

  8. BZOJ1975 SDOI2010魔法猪学院

    就是个A*,具体原理可以参考VANE的博文. 正解要手写堆,会被卡常,也许哪天我筋搭错了写一回吧. #include<bits/stdc++.h> #define r register u ...

  9. K短路 (A*算法) [Usaco2008 Mar]牛跑步&[Sdoi2010]魔法猪学院

    A*属于搜索的一种,启发式搜索,即:每次搜索时加一个估价函数 这个算法可以用来解决K短路问题,常用的估价函数是:已经走过的距离+期望上最短的距离 通常和Dijkstra一起解决K短路 BZOJ1598 ...

随机推荐

  1. [ SSH框架 ] Hibernate框架学习之三

    一.表关系的分析 Hibernate框架实现了ORM的思想,将关系数据库中表的数据映射成对象,使开发人员把对数据库的操作转化为对对象的操作,Hibernate的关联关系映射主要包括多表的映射配置.数据 ...

  2. Javascript的console['']几种常用输入方法

    1.console.log是最常用的输入方法,正常化输出语句,还具有print占位符整数(%d||%i),浮点数(%f),对象(%o),字符(%s); 2.console.error输出错误化的语句 ...

  3. Liunx权限修改命令

    语法: chmod  数值  文件名 例: chmod 644 mm.txt 命令执行后,文件mm.txt的权限值为 rw-r--r-- 详解:       权限分为 读.写.执行三种,分别用字母  ...

  4. Ubuntu系统下配置IP地址方法介绍

    配置IP方式有两种: 1.通过命令直接配置 sudo ifconfig eth0 IP地址 netmask 子网掩码------配置IP地 sudo route add default gw 网关-- ...

  5. C++string函数之strcat_s

    跟上一篇的strcpy_s一样,是新推出的较为安全的strcat函数 strcat_s脱胎于strcat,用于两个字符串的链接,strcat(str1,str2)直接返回新的str1. 但在vs200 ...

  6. imgAreaSelect 中文文档

    http://www.cnblogs.com/boychenney/archive/2011/10/08/2201996.html 一.技术文档 1.介绍 ImgAreaSelect是一jQuery插 ...

  7. 《Linux下FTP服务器搭建及FTP使用》

    .LOGAndy:mxtd114 <Linux下FTP服务器搭建> 0.root登录 1.安装ftp # yum -y install ftp 2.安装vsftpd # yum -y in ...

  8. javaXML文件的写入之DOM和DOM4J

    1.DOM篇 首先是DOM的操作方法,字符串数据可以从对象中读,例如上篇提到的Person对象,这里为了方便直接手写. package com.dom.node; import javax.xml.p ...

  9. polysh安装与使用-同时查看多台机器日志

    polysh简介 polysh 是一个交互式命令,可以在一台服务器上批量的对一批服务器进行处理,运行交互式命令.官方的简介如下: Polysh is a tool to aggregate sever ...

  10. java数据库基本操作(sqlserver 2000为例)

    一.环境搭建 1.下载对应数据库连接驱动包并引入. 2.如果在web中调用必须在tomcat中也放入对应的驱动包. 3.在jre的lib\ext中也加入对应的驱动包. 二.连接数据库 public s ...