POJ 2449 第K短路模版题 A*+最短路
来源:互联网 发布:bbc人体的奥秘知乎 编辑:程序博客网 时间:2024/05/22 16:46
点击打开链接
题意:求S到T的第K短路的长度
思路:学习了一些A*的性质,f(v)=d(v)+h(v);d是初始状态到v的距离,h是v到目标状态的距离,而在求第K短路是我们将h定义为到目标状态的最短距离,而我们利用优先队列将f小的先出队列,这样在跑A*的时候,首先到达目标状态的距离肯定是最短距离先到达,而我们要的是第K短的,所以我们将第K次出队列的目标状态的f输出就是我们要求的,特殊的是当S==T时,k要加1,至于为什么不太懂o(︶︿︶)o
#include <queue>#include <vector>#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int inf=0x3f3f3f3f;const int maxn=1010;struct edge{ int to,cost; edge(int a,int b){to=a;cost=b;}};struct A{ int v,g,f; bool operator <(const A a) const{ if(a.f==f) return a.g<g;//设置优先级,小的先出 return a.f<f; }};typedef pair<int,int> P;int V,dis[maxn],m,k;vector<edge>G[maxn];vector<edge>G1[maxn];void dijkstra(int s){ priority_queue<P,vector<P>,greater<P> >que; fill(dis,dis+V,inf); dis[s]=0;que.push(P(0,s)); while(!que.empty()){ P p=que.top();que.pop(); int v=p.second; if(dis[v]<p.first) continue; for(unsigned int i=0;i<G[v].size();i++){ edge e=G[v][i]; if(dis[e.to]>dis[v]+e.cost){ dis[e.to]=dis[v]+e.cost; que.push(P(dis[e.to],e.to)); } } }}int Astar(int st,int en){ priority_queue<A>que; A c,ne; c.v=st;c.g=0;c.f=c.g+dis[st]; que.push(c); while(!que.empty()){ c=que.top();que.pop(); //每次出来的都是当前f最小的,所以当v等于1时,第一次出来的就是最短路,以此类推 if(c.v==en){ k--; if(k==0) return c.f; } for(unsigned int i=0;i<G1[c.v].size();i++){ edge a=G1[c.v][i]; ne.v=a.to; ne.g=c.g+a.cost; ne.f=ne.g+dis[ne.v]; que.push(ne); } } return -1;}int main(){ int a,b,c; while(scanf("%d%d",&V,&m)!=-1){ for(int i=0;i<maxn;i++){ G[i].clear(); G1[i].clear(); } for(int i=0;i<m;i++){ scanf("%d%d%d",&a,&b,&c); G[b].push_back(edge(a,c)); G1[a].push_back(edge(b,c)); } scanf("%d%d%d",&a,&b,&k); dijkstra(b); if(dis[a]==inf) printf("-1\n"); else{ if(a==b) k++; int ans=Astar(a,b); printf("%d\n",ans); } } return 0;}
0 0
- POJ 2449 第K短路模版题 A*+最短路
- pku2449第K短路 最短路+A*
- poj2449 第k短路....A*+最短路
- POJ 2449 第K短路 SPFA+A*
- POJ 2449第K短路(A*+spfa)
- poj 2449(A*求第K短路)
- poj 2449 第k短路 A* + spfa
- POJ 2449 第k短路 Dijkstra+A*
- Poj 2449 第k短路
- POJ 2449 A* K短路
- POJ 2449 A* K短路
- POJ 2449 A* K短路
- POJ 2449 A* K短路
- POJ 2449 A*k短路
- POJ 2449 A*k短路
- POJ 2449 A*K短路
- POJ 2499 第k小最短路
- poj 2449 求第k最短路 A* + SPFA
- Android开发
- spark streaming updateStateByKey 用法
- listView下拉刷新加载数据
- css div自适应高度height
- hdu1402 A * B Problem Plus (FFT)
- POJ 2449 第K短路模版题 A*+最短路
- 指针函数和函数指针
- 正数放右边,负数放左边 —— java
- c++作业3
- mosquitto 理解 -- (1)
- Problem A: 求数组元素的和。
- Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
- maven
- ios delete provision profile