poj 2449 模板题  A*+spfa

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. #define mt(a,b) memset(a,b,sizeof(a))
  6. using namespace std;
  7. const int inf=0x3f3f3f3f;
  8. class AStar { ///A*+spfa求第k短路
  9. typedef int typec;///边权的类型
  10. static const int ME=1e5+;///边的个数
  11. static const int MV=1e3+;///点的个数
  12. struct G {
  13. struct E {
  14. int v,next;
  15. typec w;
  16. } e[ME];
  17. int le,head[MV];
  18. void init(int n) {
  19. le=;
  20. for(int i=; i<=n; i++) head[i]=-;
  21. }
  22. void add(int u,int v,typec w) {
  23. e[le].v=v;
  24. e[le].w=w;
  25. e[le].next=head[u];
  26. head[u]=le++;
  27. }
  28. };
  29. class Spfa { ///单源最短路o(k*ME)k~=2
  30. G g;
  31. int n,inque[MV],i,u,v;
  32. typec dist[MV];
  33. bool used[MV];
  34. queue<int> q;
  35. public:
  36. void init(int tn) { ///传入点的个数
  37. n=tn;
  38. g.init(n);
  39. }
  40. void add(int u,int v,typec w) {
  41. g.add(u,v,w);
  42. }
  43. bool solve(int s) { ///传入起点,存在负环返回false
  44. for(i=; i<=n; i++) {
  45. dist[i]=inf;
  46. used[i]=true;
  47. inque[i]=;
  48. }
  49. used[s]=false;
  50. dist[s]=;
  51. inque[s]++;
  52. while(!q.empty()) q.pop();
  53. q.push(s);
  54. while(!q.empty()) {
  55. u=q.front();
  56. q.pop();
  57. used[u]=true;
  58. for(i=g.head[u]; ~i; i=g.e[i].next) {
  59. v=g.e[i].v;
  60. if(dist[v]>dist[u]+g.e[i].w) {
  61. dist[v]=dist[u]+g.e[i].w;
  62. if(used[v]) {
  63. used[v]=false;
  64. q.push(v);
  65. inque[v]++;
  66. if(inque[v]>n) return false;
  67. }
  68. }
  69. }
  70. }
  71. return true;
  72. }
  73. typec getdist(int id) {
  74. return dist[id];
  75. }
  76. } spfa;
  77. struct Q {
  78. int p;
  79. typec g,h;
  80. friend bool operator <(const Q &a,const Q &b) {
  81. return a.g+a.h>b.g+b.h;
  82. }
  83. } now,pre;
  84. priority_queue<Q> q;
  85. int n,cnt[MV];
  86. G g;
  87. typec ans;
  88. public:
  89. void init(int tn) {
  90. n=tn;
  91. g.init(n);
  92. spfa.init(n);
  93. }
  94. void add(int u,int v,typec w) {
  95. g.add(u,v,w);
  96. spfa.add(v,u,w);
  97. }
  98. bool solve(int s,int t,int k) {
  99. if(s==t) k++;
  100. spfa.solve(t);
  101. while (!q.empty()) q.pop();
  102. for(int i=; i<=n; i++) cnt[i]=;
  103. now.p=s;
  104. now.g=;
  105. now.h=;
  106. q.push(now);
  107. while(!q.empty()) {
  108. pre=q.top();
  109. q.pop();
  110. int u=pre.p;
  111. cnt[u]++;
  112. if(cnt[u]==k&&u==t) {
  113. ans=pre.h+pre.g;
  114. return true;
  115. }
  116. if(cnt[u]>k) continue;
  117. for(int i=g.head[u]; ~i; i=g.e[i].next) {
  118. now.h=pre.h+g.e[i].w;
  119. int v=g.e[i].v;
  120. now.g=spfa.getdist(v);
  121. now.p=v;
  122. q.push(now);
  123. }
  124. }
  125. return false;
  126. }
  127. typec getans() {
  128. return ans;
  129. }
  130. } gg;
  131. int main() {
  132. int n,m,u,v,w,s,t,k;
  133. while(~scanf("%d%d",&n,&m)) {
  134. gg.init(n);
  135. while(m--) {
  136. scanf("%d%d%d",&u,&v,&w);
  137. gg.add(u,v,w);
  138. }
  139. scanf("%d%d%d",&s,&t,&k);
  140. if(!gg.solve(s,t,k)) {
  141. puts("-1");
  142. } else {
  143. printf("%d\n",gg.getans());
  144. }
  145. }
  146. return ;
  147. }

第k短路的更多相关文章

  1. POJ 2449 Remmarguts' Date --K短路

    题意就是要求第K短的路的长度(S->T). 对于K短路,朴素想法是bfs,使用优先队列从源点s进行bfs,当第K次遍历到T的时候,就是K短路的长度. 但是这种方法效率太低,会扩展出很多状态,所以 ...

  2. POJ 2449Remmarguts' Date K短路模板 SPFA+A*

    K短路模板,A*+SPFA求K短路.A*中h的求法为在反图中做SPFA,求出到T点的最短路,极为估价函数h(这里不再是估价,而是准确值),然后跑A*,从S点开始(此时为最短路),然后把与S点能达到的点 ...

  3. BZOJ-1975 魔法猪学院 K短路 (A*+SPFA)

    1975: [Sdoi2010]魔法猪学院 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1323 Solved: 433 [Submit][Statu ...

  4. 【POJ】2449 Remmarguts' Date(k短路)

    http://poj.org/problem?id=2449 不会.. 百度学习.. 恩. k短路不难理解的. 结合了a_star的思想.每动一次进行一次估价,然后找最小的(此时的最短路)然后累计到k ...

  5. poj 2449 Remmarguts' Date K短路+A*

    题目链接:http://poj.org/problem?id=2449 "Good man never makes girls wait or breaks an appointment!& ...

  6. poj 2449(A*求第K短路)

    题目链接:http://poj.org/problem?id=2449 思路:我们可以定义g[x]为源点到当前点的距离,h[x]为当前点到目标节点的最短距离,显然有h[x]<=h*[x](h*[ ...

  7. K短路

    K短路 用dijsktra+A*启发式搜索当点v第K次出堆的时候,这时候求得的路径是k短路.A*算法有一个启发式函数f(p)=g(p)+h(p), 即评估函数=当前值+当前位置到终点的最短距离g(p) ...

  8. poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)

    http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  9. bzoj 1975 [Sdoi2010]魔法猪学院(k短路)

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

随机推荐

  1. js如何将纯数字字符串转换为long型

    1.js如何将纯数字字符串转换为long型? js 中 int的存储位数?最大十进制数表示是多少? 精度http://www.jb51.net/article/59808.htm 整数(不使用小数点或 ...

  2. 一、MongoDB的下载、安装与部署

    1.什么是MongoDB? 它是介于关系型数据库和非关系型数据库之间的一种NoSQL数据库,用C++编写,是一款集敏捷性.可伸缩性.扩展性于一身的高性能的面向文档的通用数据库. 2.为什么要用Mong ...

  3. hbase与Hadoop

    Hbase是一种低延迟的在线系统,Hadoop是优化吞吐量的离线系统.这种互补关系造就了一种强大的.灵活的数据平台,可以用来搭建水平扩展的数据应用.

  4. 18)Java八股文名词

      >VO:   value-object >DTO: Data Transform Object >DTD: Document Type Definition      文档类型定 ...

  5. Java 第六天 Spring Annotation 和其它

    Annotation,是Java语言中的一种特殊的元数据语法,Spring支持使用annotation来进行对象实例化和装配 使用Annotation在Spring的配置xml中添加context命名 ...

  6. MySQL性能优化笔记整理

    一.测试篇 1.测试目的,就是量化找出短板(基础参数配置) 2.测试三大指标 IOPS:每秒处理的IO请求数,即IO响应速度(注意和IO吞吐量的区别) QPS:每秒请求(查询)次数 TPS:每秒事务数 ...

  7. pure的bug记录2

    <select id="stacked-state" style=" font-family: "Microsoft YaHei"; " ...

  8. SRF之数据验证

    实现表单输入数据的验证,包括客户端验证和服务器端验证 如何使用 数据验证在业务层的实体类字段上增加数据验证的特性,例如 public class User { [Required(ErrorMessa ...

  9. <?php>慢慢写一些php的cookie问题<?>

    写网站是个爬坑的过程,在你设计完功能之后,就会发现:卧槽,这个怎么实现?你妹,这个能实现么? 进了公司分工明确还好说(= =学长们都这么说),在学校自己没事写一些项目的话只能自己爬坑了. 蹬蹬瞪蹬,登 ...

  10. Android-简单的sdcard文件浏览

    功能:能够浏览手机里面的文件夹和文件,代码灰常简单 先看布局 <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...