poj2449(第k短路)
题意:
给出一个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短路)相关推荐
- poj2449(k短路算法)
K 短路问题(A* 启发式广搜) 1.k 短路问题就是最短路问题的延申,要找出第 k 短的路径.用广搜进行路径查找,第一次找到的 就是最短路,第二次找到的是第 2 短 路⋯以此类推.所以我们只需要一直 ...
- 第K短路模板【POJ2449 / 洛谷2483 / BZOJ1975 / HDU6181】
1.到底如何求k短路的? 我们考虑,要求k短路,要先求出最短路/次短路/第三短路--/第(k-1)短路,然后访问到第k短路. 接下来的方法就是如此操作的. 2.f(x)的意义? 我们得到的f(x)更小 ...
- Poj2449 Remmarguts' Date 【A*搜索】K短路
http://poj.org/problem?id=2449 A*搜索求K短路. #include <cstdio> #include <cstring> #include & ...
- poj2449 Remmarguts' Date(第k短路问题)(A*+spfa/dijkstra)
思路来源 https://blog.csdn.net/berrykanry/article/details/78345894(通俗易懂解释好评) https://www.cnblogs.com/yyf ...
- poj2449 K短路模板题
昨晚看WC论文发现自己连K短路的经典A*算法还不会,补了一波,模板题输出-1后没return继续跑wa了一早上...... 算法流程: ①在反向图中求出t到每个点的最短路 ②从原点bfs,估价f=d+ ...
- POJ 2449 Remmarguts' Date(k短路模板)
link:https://vjudge.net/problem/POJ-2449 前面输入与大多最短路题相同 最后一行输入s,t,k 求从s到t的第K短路 wiki link: https://en. ...
- 第K短路+严格第K短路
所谓K短路,就是从s到t的第K短的路,第1短就是最短路. 如何求第K短呢?有一种简单的方法是广度优先搜索,记录t出队列的次数,当t第k次出队列时,就是第k短路了.但点数过大时,入队列的节点过多,时间和 ...
- 图论 —— k 短路
[概述] 所谓 k 短路问题,是指给定一个具有 n 个点 m 条边的带正权有向图,再给定起点 S 与终点 T,询问从 S 到 T 的所有权和中,第 k 短的路径的长度. k 短路问题的解决方法有两种, ...
- A* 第k短路详解 (详尽)
首先分享一个我学习的博客文章: Poj2449-A*初步+k短路 看着他的题解学会了k短路..%%% 然后我就大致说一说k短路的求法吧.. 首先我们来看看A*. A*,启发式搜索,是一种较为有效的搜索 ...
最新文章
- XamarinAndroid组件教程设置动画的时长参数
- windows msys编译64位x264和ffmpeg
- python表白程序-用Python做一个表白小姐姐的程序
- python简单发音-Python如何实现文本转语音
- 线程 、进程、协程 三者区别
- vscode 新建cpp文件_Visual Studio Code (vscode)编译C++
- gcc / -L 和 -Wl,-rpath 区别
- Linux的chmod与chgrp
- Django模板语言
- app 应用商店系统php,GitHub - ChhXin/appstore-admin: 基于ThinkPHP的应用商店后台管理系统...
- 一周学C#之第4天——语句
- vector 赋值_从零开始学习R语言(一)——数据结构之“向量”(Vector)
- 2021东营高考成绩查询,2021东营市地区高考成绩排名查询,东营市高考各高中成绩喜报榜单...
- telnet 远程登陆
- java制作摇奖系统_基于Java实现抽奖系统
- 在线生成透明ICO图标
- 解决python运行selenium程序执行完后,Chrome浏览器自动关闭的问题
- 2018我们讲一下百度云BAE专业引擎的使用
- 浅谈短视频APP的发展趋势
- R语言对京东商品进行文本爬虫