1. #include<queue>
  2. #include<cstdio>
  3. #include<string>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<algorithm>
  7. using namespace std;
  8. const int MAXN = 1010;
  9. const int MAXM = 100010;
  10. const int INF = 0x7fffffff;
  11. typedef struct{
  12. int to, next, w;
  13. }Edge;
  14. typedef struct Node{
  15. int p, g, h;
  16. Node(int p, int g, int h){
  17. this->p = p;
  18. this->g = g;
  19. this->h = h;
  20. }
  21. bool operator < (const Node &node) const{
  22. return node.g+node.h < g+h;
  23. }
  24. }Node;
  25. Edge edge[MAXM << 1];
  26. int n, m;
  27. int head[MAXN], tail[MAXN], dist[MAXN];
  28. int cnt[MAXN], vis[MAXN];
  29. void addEdge(int u, int v, int w, int k){
  30. edge[k].to = v;
  31. edge[k].w = w;
  32. edge[k].next = head[u];
  33. head[u] = k++;
  34. edge[k].to = u;
  35. edge[k].w = w;
  36. edge[k].next = tail[v];
  37. tail[v] = k;
  38. }
  39. void init(int s){
  40. memset(vis, 0, sizeof(vis));
  41. memset(cnt, 0, sizeof(cnt));
  42. for(int i = 1;i <= n;i ++) dist[i] = INF;
  43. dist[s] = 0;
  44. vis[s] = 1;
  45. }
  46. void spfa(int s){
  47. init(s);
  48. queue<int>q;
  49. q.push(s);
  50. while(!q.empty()){
  51. int p = q.front();
  52. vis[p] = 0;
  53. q.pop();
  54. for(int i = tail[p];~i;i = edge[i].next){
  55. int u = edge[i].to;
  56. if(dist[u] > dist[p] + edge[i].w){
  57. dist[u] = dist[p] + edge[i].w;
  58. if(!vis[u]){
  59. vis[u] = 1;
  60. q.push(u);
  61. }
  62. }
  63. }
  64. }
  65. }
  66. int aStar(int s, int t, int k){
  67. priority_queue<Node>Q;
  68. if(dist[s] == INF) return -1;
  69. Q.push(Node(s, 0, dist[s]));
  70. while(!Q.empty()){
  71. Node tt = Q.top();
  72. cnt[tt.p] ++ ;
  73. if(cnt[tt.p] > k) continue;
  74. if(cnt[tt.p] == k && tt.p == t) return tt.g+tt.h;
  75. Q.pop();
  76. for(int i = head[tt.p];~i;i = edge[i].next){
  77. int u = edge[i].to;
  78. Q.push(Node(u, tt.g+edge[i].w, dist[u]));
  79. }
  80. }
  81. return -1;
  82. }
  83. int main(){
  84. int s, t, k;
  85. int u, v, w;
  86. //freopen("in.c", "r", stdin);
  87. while(~scanf("%d%d", &n, &m)){
  88. memset(head, -1, sizeof(head));
  89. memset(tail, -1, sizeof(tail));
  90. k = 1;
  91. for(int i = 1;i <= m;i ++){
  92. scanf("%d%d%d", &u, &v, &w);
  93. addEdge(u, v, w, k);
  94. k += 2;
  95. }
  96. scanf("%d%d%d", &s, &t, &k);
  97. if(s == t) k++;
  98. spfa(t);
  99. int ans = aStar(s, t, k);
  100. printf("%d\n", ans);
  101. }
  102. return 0;
  103. }

POJ 2449的更多相关文章

  1. poj 2449 Remmarguts&#39; Date 【SPFA+Astar】【古典】

    称号:poj 2449 Remmarguts' Date 意甲冠军:给定一个图,乞讨k短路. 算法:SPFA求最短路 + AStar 以下引用大牛的分析: 首先,为了说话方便,列出一些术语: 在启示式 ...

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

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

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

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

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

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

  5. poj 2449 第k短路

    题目链接:http://poj.org/problem?id=2449 #include<cstdio> #include<cstring> #include<iostr ...

  6. POJ 2449 - Remmarguts' Date - [第k短路模板题][优先队列BFS]

    题目链接:http://poj.org/problem?id=2449 Time Limit: 4000MS Memory Limit: 65536K Description "Good m ...

  7. poj 2449 k短路+A*算法

    http://poj.org/problem?id=2449 K短路的定义: 1.如果起点终点相同,那么0并不是最短路,而是要出去一圈回来之后才是最短路,那么第K短路也是一样. 2.每个顶点和每条边都 ...

  8. poj 2449 Remmarguts' Date(K短路,A*算法)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u013081425/article/details/26729375 http://poj.org/ ...

  9. poj 2449 Remmarguts' Date (k短路模板)

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

  10. 【POJ 2449】 Remmarguts' Date

    [题目链接] http://poj.org/problem?id=2449 [算法] A*(启发式搜索) 首先,求第k短路可以用优先队列BFS实现,当T第k次入队时,就求得了第k短路,但是,这种做法的 ...

随机推荐

  1. Unix/Linux之命令备忘录

    ps:是显示瞬间进程的状态,并不动态连续 kill:用于杀死进程或者给进程发送信号 // 在Linux下查看所有java进程命令 ps -ef | grep java: //  停止所有java进程命 ...

  2. ASP.NET MVC3实现无刷新验证码

    在MVC中进行留言,评论等功能时,不可避免会用到表单提交时的验证码问题,有时,我们的作法是,当表单被提交后,在controller里去判断验证码的正确与否,但我认为这种用户体验是很差的,今天正好有后时 ...

  3. [CSS]white-space 属性详解

    实例 规定段落中的文本不进行换行: p { white-space: nowrap } 可能的值 值 描述 normal 默认.空白会被浏览器忽略. pre 空白会被浏览器保留.其行为方式类似 HTM ...

  4. Python调试工具-Spyder

    OS:Windows 7 关键字:Python IDE, Spyder 1.安装工具pip:https://pip.pypa.io/en/latest/installing.html 下载 get-p ...

  5. python zookeeper 学习笔记

    1.安装zookeeper 下载zookeeper后,解压,安装 cd zookeeper-/src/c ./configure make make install 2.启动zookeeper服务 c ...

  6. JS-------DOM0级事件处理和DOM2级事件处理-------简单记法

    0级DOM 分为2个:一是在标签内写onclick事件  二是在JS写onlicke=function(){}函数 1) <input id="myButton" type= ...

  7. Oracle表添加主键、外键

    1.创建表的同时创建主键约束 (1)无命名 create table student ( studentid int primary key not null, studentname varchar ...

  8. python 脚本

    mag3.py 1,import import sys from org.eclipse.jface.dialogs import MessageDialogfrom org.eclipse.core ...

  9. 制作标签(Label)

    怎样判断是否应当使用标签 当游戏中出现需要程序输出文字的地方,就要使用标签. 创建标签 在Unity顶部选择NGUI菜单.选择Create->Label,即可创建一个Label. Label的文 ...

  10. cocos2dx Tab选项卡控件的实现

    选项卡控件在游戏和应用中很是常见,但是cocostudio里并没有实现好的选项卡控件,于是自己封装了 一个,效果如下: 代码: TabUiControl.h #pragma once //std #i ...