思路:

利用一个估计函数g[i]=dis[i]+len。其中len为队列出来的点当前已经走了的距离。dis[i]为该点到终点的最短路径。这样我们只要将点按g[i]的升序在队列你排序,每次取出最小的g[i]值的点。其意义就是每次找最短的能到终点的点。第一次找到就是最短路径,第二次就是就是第二短,第三次就是...顺推

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#define Maxn 1010
#define Maxm 200200
#define inf 10000000
using namespace std;
int dis[Maxn],vi[Maxn],head[Maxn],e,map[Maxn][Maxn],n,m,cnt[Maxn];
struct Edge{
int u,v,next,val;
}edge[Maxm];
struct Point{
int u,len;
int operator <(const Point &temp) const
{
return len+dis[u]>temp.len+dis[temp.u];
}
};
void init()
{
e=;
memset(dis,,sizeof(dis));
memset(vi,,sizeof(vi));
memset(head,-,sizeof(head));
memset(cnt,,sizeof(cnt));
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
map[i][j]=inf;
}
}
void add(int u,int v,int val)
{
edge[e].v=v;edge[e].val=val;edge[e].next=head[u];head[u]=e++;
map[v][u]=(val<map[v][u]?val:map[v][u]);
}
void dijkstra(int s)
{
int i,j,u;
for(int i=;i<=n;i++)
dis[i]=inf,vi[i]=;
for(i=;i<=n;i++)
dis[i]=map[s][i];
dis[s]=;
for(i=;i<=n;i++)
{
int min=inf;
for(j=;j<=n;j++)
if(!vi[j] && dis[j]<=min)
{
u=j;
min=dis[j];
}
if(min==inf) break;
vi[u]=;
for(j=;j<=n;j++)
{
if(!vi[j]&&dis[j]>dis[u]+map[u][j])
dis[j]=dis[u]+map[u][j];
}
}
}
int A_star(int s,int t,int k)
{
priority_queue<Point> q;
memset(vi,,sizeof(vi));
Point a,p;
a.u=s,a.len=;
q.push(a);
while(!q.empty())
{
a=q.top();
q.pop();
vi[a.u]++;
if(vi[a.u]>k) continue;
if(vi[t]==k) return a.len;
for(int v=head[a.u];v!=-;v=edge[v].next)
{
p.u=edge[v].v;
p.len=a.len+edge[v].val;
q.push(p);
}
}
return -;
}
int main()
{
int i,j,s,t,k,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(i=;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
scanf("%d%d%d",&s,&t,&k);
dijkstra(t);
if(s==t)
k++;
if(dis[s]==inf)
{
printf("-1\n");
continue;
}
printf("%d\n",A_star(s,t,k));
}
return ;
}

poj 2449 第k短路径的更多相关文章

  1. A* 算法求第k短路径

    A*算法是一类贪心算法,其可以用于寻找最优路径.我们可以利用A*算法来求第k短路径. 一条路径可以由两部分组成,第一部分是一个从出发到达任意点的任意路径,而第二部分是从第一部分的末端出发,到终点的最短 ...

  2. POJ 2449 Remmarguts' Date (第k短路径)

    Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions:35025   Accepted: 9467 ...

  3. poj 2449 第k短路

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

  4. POJ 3255 Roadblocks --次短路径

    由于次短路一定存在,则可知次短路一定是最短路中某一条边不走,然后回到最短路,而且只是一条边,两条边以上不走的话,就一定不会是次短路了(即以边换边才能使最小).所以可以枚举每一条边,算出从起点到这条边起 ...

  5. [BFS,A*,k短路径] 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 path (Problem - 6705)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6705 path Time Limit: 2000/2000 MS (Java/Others)    Mem ...

  6. POJ 2449 第k短路 Dijkstra+A*

    这道题我拖了半年,,,终于写出来了 思路: 先反向建边 从终点做一次最短路 ->这是估价函数h(x) 再正常建边,从起点搜一遍 (priority_queue(h(x)+g(x))) g(x)是 ...

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

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

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

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

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

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

随机推荐

  1. delphi回调函数

    文章来源: http://anony3721.blog.163.com/blog/static/5119742010866050589/ 一.主单元 unit UnMain; interface us ...

  2. poj3041

    Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12162   Accepted: 6620 Descri ...

  3. CSS 的 appearance 属性

    在 Firefox 1.0+,Chrome 1.0+ 和 Safari 3.0+ 中,我们可以使用 -moz-appearance 或者 -webkit-appearance 属性让元素模仿系统原生控 ...

  4. 如何彻底隐藏iOS7应用的status bar

    用xcode5开发新的iOS游戏,发现一个坑爹的现象,虽然我已经在info.plist里面把Status bar is initially hidden设置成了YES,但在设备上一跑还是看到丑陋的st ...

  5. Cocos2d-x——Cocos2d-x 屏幕适配总结

    本张图以iPhone5为例子,并且采用ResolutionNoBorder的绘制方式(这种方式就是会在原图的基础上出现裁切,一部分图片会显示到屏幕外边去,如AEHD和FBCG就是显示到屏幕外边的内容) ...

  6. C++ 动态创建对象

    转自:http://www.cnblogs.com/jisi5789/p/3190353.html 回顾前面的文章,实现了一个简单工厂模式来创建不同类对象,但由于c++没有类似new "Ci ...

  7. PostgreSQL的initdb 源代码分析之六

    继续分析 下面的是获取运行此程序的用户名称,主要还是为了防止在linux下用root来运行的情形. effective_user = get_id(); ) username = effective_ ...

  8. IT项目管理工具总结(转载)

    以前用过一个cs版的忘记叫啥名了,还用个禅道,感觉一般“5. 测试管理: 项目软件缺陷Bug状态跟踪”在公司内部自己测试或者试用期上线后后期维护阶段用的多,有的公司单独做个系统让用户提问题来修改,也是 ...

  9. URAL 1774 A - Barber of the Army of Mages 最大流

    A - Barber of the Army of MagesTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/v ...

  10. libIconv.lib编码库的生成和使用

    iconv是将一种编码格式转换为另一种编码格式的开源库,例如可以把Windows环境下通用的ASCii(中文是GB2312)编码转换为国际通用的Unicode编码 iconv最新版本只支持MingW和 ...