题目

题意:求 点s 到 点t 的 第 k 短 路的距离;

估价函数=当前值+当前位置到终点的距离

f(n)=g(n)+h(n);     g(n)表示g当前从s到p所走的路径的长度,      h(n)‘启发式函数’,表示为终点t到其余一点p的路径长度;

(1)将有向图的所有边反向,以原终点t为源点,求解t到所有点的最短距离; 

(2)新建一个优先队列,将源点s加入到队列中; 

(3)从优先级队列中弹出f(p)最小的点p,如果点p就是t,则计算t出队的次数; 

如果当前为t的第k次出队,则当前路径的长度就是s到t的第k短路的长度,算法结束; 

否则遍历与p相连的所有的边,将扩展出的到p的邻接点信息加入到优先级队列;

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std; const int Maxn = 10010;
const int INF = 1e9; struct node{
int to,val;
node(){}
node(int a,int b)
{
to = a; val = b;
}
}; vector<node> adj[Maxn],_adj[Maxn]; int n,m,k;
bool vis[Maxn];
int dis[Maxn]; void AddEdge(int x,int y,int val)
{
adj[x].push_back(node(y,val));
_adj[y].push_back(node(x,val));//反向存图
}
void Dijkstra(int s,int t)
{
priority_queue<int, vector<int>,greater<int> > q;
while(!q.empty()) q.pop();
for(int i=1;i<=n;i++)
vis[i]=false,dis[i]=INF;
vis[t]=true;dis[t]=0;q.push(t);
int u,len;
while(!q.empty())
{
u = q.top(); q.pop();
len = _adj[u].size();
for(int i=0;i<len;i++)
{
node v = _adj[u][i];
if(dis[v.to]>dis[u]+v.val)
{
dis[v.to]=dis[u]+v.val;
if(!vis[v.to])
{
q.push(v.to);
vis[v.to]=true;
}
}
}
vis[u]= false;
}
}
struct Anode{
int h,g,id;
Anode(int a,int b,int c){h=a;g=b;id=c;}
bool operator < (Anode a) const{
return h+g > a.h + a.g;
}
};
priority_queue<Anode> Q;
int Astar(int s,int t) //A*算法
{
while(!Q.empty()) Q.pop();
Q.push(Anode(0,dis[s],s));
int len,num;
num=0;
while(!Q.empty())
{
Anode u = Q.top();
Q.pop();
if(u.id==t) ++num;
if(num>=k) return u.h;
len = adj[u.id].size();
for(int i=0;i<len;i++)
{
node v = adj[u.id][i];
Q.push(Anode(u.h+v.val,dis[v.to],v.to));
}
}
return -1;
}
int main()
{
while(scanf("%d%d",&n,&m)!=-1)
{
for(int i=0;i<Maxn;i++)
adj[i].clear(),_adj[i].clear();
int x,y,v,s,t;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&v);
AddEdge(x,y,v);
}
scanf("%d%d%d",&s,&t,&k);
if(s==t) k++;
Dijkstra(s,t);
printf("%d\n",Astar(s,t));
}
return 0;
}
/*
2 2
1 2 5
2 1 4
1 2 2
*/

poj 2449 Remmarguts' Date【第K短路】的更多相关文章

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

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

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

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

  3. poj 2449 Remmarguts' Date 第k短路 (最短路变形)

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 33606   Accepted: 9116 ...

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

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

  5. POJ 2449 Remmarguts' Date ( 第 k 短路 && A*算法 )

    题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include ...

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

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

  7. 【POJ】2449.Remmarguts' Date(K短路 n log n + k log k + m算法,非A*,论文算法)

    题解 (搬运一个原来博客的论文题) 抱着板题的心情去,结果有大坑 就是S == T的时候也一定要走,++K 我发现按照论文写得\(O(n \log n + m + k \ log k)\)算法没有玄学 ...

  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. poj 2449 Remmarguts' Date K短路+A*

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

  10. 图论(A*算法,K短路) :POJ 2449 Remmarguts' Date

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 ...

随机推荐

  1. 快速掌握Ajax-Ajax基础实例(Ajax返回Json在Java中的实现)

    (转)实例二:Ajax返回Json在Java中的实现 转自http://www.cnblogs.com/lsnproj/archive/2012/02/09/2341524.html#2995114 ...

  2. linux利用crontab设置定时任务运行jar包

    参考链接: 1.http://blog.csdn.net/javadhh/article/details/42779505 2.http://blog.csdn.net/cctv_liu/articl ...

  3. nodejs 后台开发 和C++代码开发

    https://www.npmjs.com/package/node-gyp node-gyp Node.js native addon build tool Node.js native addon ...

  4. BUG(0):用某位表示特定属性

    用某个bit表示特定属性通常有两种方式: 1.指定某个特定的value #define _PAGE_VALID 0x0001 0bit 为 1 时表示此时的page entry是有效的 用法如下,此时 ...

  5. 论坛:设计实体-->分析功能-->实现功能 之 《分析功能》

    其中 管理文章 的功能没有做,以下做的设计 浏览与参与 功能的步骤 分析功能   5个功能.   7个请求. 实现功能   Action, 7个方法   Service   Dao   Jsp For ...

  6. Mysql 注入load_file常用路径

    WINDOWS下: c:/boot.ini //查看系统版本 c:/windows/php.ini //php配置信息 c:/windows/my.ini //MYSQL配置文件,记录管理员登陆过的M ...

  7. 拼图类APP原型模板分享——简拼

    简拼是一款记录美好.抒写情怀的拼图APP,模板设计风格简约文艺,种类齐全. 此原型模板所用到的组件有标签组.水平分隔线.圆形工具.交互动作有结合标签组实现页面跳转,选择组件触发按钮状态变化等. 此原型 ...

  8. muduo 的windows下的编译

    四处寻觅开源代码学习,适合的代码非常稀少,不适合的原因却千奇百怪. 不是使用语言特性过于老旧(c++03) 就是使用的冷僻语法(template<T> enable_share_from_ ...

  9. jvm 基础

    1. JDK 包含 java 程序设计语言,JVM, Java API类库. java 开发最小环境 2. JRE : Java API类库中java se API 子集和java 虚拟机(HotSp ...

  10. python代码检索小引擎

    https://www.programcreek.com/python/