题意:

给出一个n个点、m条边的有向有环图,求从s到t的第k短路是多少。

思路:

spfa+A*。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>using namespace std;#define MAXN 1050
#define MAXM 500050
#define INF 123456789struct node
{int v,w,next;
};
node edge1[MAXM];
node edge2[MAXM];struct A
{int f,g,v;bool operator < (const A a)const{if(a.f==f)return a.g<g;return a.f<f;}
};int e,n,m,s,t,k;
int vis[MAXN];
int d[MAXN];
int q[MAXM*5];
int head1[MAXN];
int head2[MAXN];void addedge(int x,int y,int w)
{edge1[e].v=y;edge1[e].w=w;edge1[e].next=head1[x];head1[x]=e;edge2[e].v=x;edge2[e].w=w;edge2[e].next=head2[y];head2[y]=e++;
}void spfa(int src)
{for(int i=1; i<=n; i++)d[i]=INF;memset(vis,0,sizeof(vis));vis[src]=0;int h=0,t=1;q[0]=src;d[src]=0;while(h<t){int u=q[h++];vis[u]=0;for(int i=head2[u]; i!=-1; i=edge2[i].next){int v=edge2[i].v;int w=edge2[i].w;if(d[v]>d[u]+w){d[v]=d[u]+w;if(!vis[v]){q[t++]=v;vis[v]=1;}}}}
}int Astar(int src,int des)
{int cnt=0;priority_queue<A>Q;if(src==des)k++;if(d[src]==INF)return -1;A t,tt;t.v=src,t.g=0,t.f=t.g+d[src];Q.push(t);while(!Q.empty()){tt=Q.top();Q.pop();if(tt.v==des){cnt++;if(cnt==k)return tt.g;}for(int i=head1[tt.v]; i!=-1; i=edge1[i].next){t.v=edge1[i].v;t.g=tt.g+edge1[i].w;t.f=t.g+d[t.v];Q.push(t);}}return -1;
}int main()
{while(scanf("%d%d",&n,&m)!=EOF){e=0;memset(head1,-1,sizeof(head1));memset(head2,-1,sizeof(head2));for(int i=0; i<m; i++){int u,v,x;scanf("%d%d%d",&u,&v,&x);addedge(u,v,x);}scanf("%d%d%d",&s,&t,&k);spfa(t);
//      for(int i=1;i<=n;i++)
//          printf("dis=%d\n",d[i]);int ans=Astar(s,t);printf("%d\n",ans);}return 0;
}

poj2449(第k短路)相关推荐

  1. poj2449(k短路算法)

    K 短路问题(A* 启发式广搜) 1.k 短路问题就是最短路问题的延申,要找出第 k 短的路径.用广搜进行路径查找,第一次找到的 就是最短路,第二次找到的是第 2 短 路⋯以此类推.所以我们只需要一直 ...

  2. 第K短路模板【POJ2449 / 洛谷2483 / BZOJ1975 / HDU6181】

    1.到底如何求k短路的? 我们考虑,要求k短路,要先求出最短路/次短路/第三短路--/第(k-1)短路,然后访问到第k短路. 接下来的方法就是如此操作的. 2.f(x)的意义? 我们得到的f(x)更小 ...

  3. Poj2449 Remmarguts' Date 【A*搜索】K短路

    http://poj.org/problem?id=2449 A*搜索求K短路. #include <cstdio> #include <cstring> #include & ...

  4. poj2449 Remmarguts' Date(第k短路问题)(A*+spfa/dijkstra)

    思路来源 https://blog.csdn.net/berrykanry/article/details/78345894(通俗易懂解释好评) https://www.cnblogs.com/yyf ...

  5. poj2449 K短路模板题

    昨晚看WC论文发现自己连K短路的经典A*算法还不会,补了一波,模板题输出-1后没return继续跑wa了一早上...... 算法流程: ①在反向图中求出t到每个点的最短路 ②从原点bfs,估价f=d+ ...

  6. POJ 2449 Remmarguts' Date(k短路模板)

    link:https://vjudge.net/problem/POJ-2449 前面输入与大多最短路题相同 最后一行输入s,t,k 求从s到t的第K短路 wiki link: https://en. ...

  7. 第K短路+严格第K短路

    所谓K短路,就是从s到t的第K短的路,第1短就是最短路. 如何求第K短呢?有一种简单的方法是广度优先搜索,记录t出队列的次数,当t第k次出队列时,就是第k短路了.但点数过大时,入队列的节点过多,时间和 ...

  8. 图论 —— k 短路

    [概述] 所谓 k 短路问题,是指给定一个具有 n 个点 m 条边的带正权有向图,再给定起点 S 与终点 T,询问从 S 到 T 的所有权和中,第 k 短的路径的长度. k 短路问题的解决方法有两种, ...

  9. A* 第k短路详解 (详尽)

    首先分享一个我学习的博客文章: Poj2449-A*初步+k短路 看着他的题解学会了k短路..%%% 然后我就大致说一说k短路的求法吧.. 首先我们来看看A*. A*,启发式搜索,是一种较为有效的搜索 ...

最新文章

  1. XamarinAndroid组件教程设置动画的时长参数
  2. windows msys编译64位x264和ffmpeg
  3. python表白程序-用Python做一个表白小姐姐的程序
  4. python简单发音-Python如何实现文本转语音
  5. 线程 、进程、协程 三者区别
  6. vscode 新建cpp文件_Visual Studio Code (vscode)编译C++
  7. gcc / -L 和 -Wl,-rpath 区别
  8. Linux的chmod与chgrp
  9. Django模板语言
  10. app 应用商店系统php,GitHub - ChhXin/appstore-admin: 基于ThinkPHP的应用商店后台管理系统...
  11. 一周学C#之第4天——语句
  12. vector 赋值_从零开始学习R语言(一)——数据结构之“向量”(Vector)
  13. 2021东营高考成绩查询,2021东营市地区高考成绩排名查询,东营市高考各高中成绩喜报榜单...
  14. telnet 远程登陆
  15. java制作摇奖系统_基于Java实现抽奖系统
  16. 在线生成透明ICO图标
  17. 解决python运行selenium程序执行完后,Chrome浏览器自动关闭的问题
  18. 2018我们讲一下百度云BAE专业引擎的使用
  19. 浅谈短视频APP的发展趋势
  20. R语言对京东商品进行文本爬虫

热门文章

  1. USTC English Club Note20171013(2)
  2. 目标文件里面到底有什么(1)?
  3. 关于SQL Server的若干注意事项
  4. spring源码研究
  5. 忽略某些文件 —— Git 学习笔记 05
  6. 数据段描述符和代码段描述符(二)——《x86汇编语言:从实模式到保护模式》读书笔记11
  7. 【C/C++多线程编程之六】pthread互斥量
  8. Java后端返回通用接口设计
  9. UNIX再学习 -- 线程控制
  10. dmesg与printk命令