A*求单元第k短路的模板
2017-08-25 16:51
225 查看
#include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #include <deque> #include <vector> #include <list> #include <queue> #include <string> #include <cstring> #include <map> #define PI acos(-1.0) #define mem(a,b) memset(a,b,sizeof(a)) #define sca(a) scanf("%d",&a) #define pri(a) printf("%d\n",a) #define MM 500002 #define MN 1002 #define INF 168430090 using namespace std; typedef long long ll; int n,m,st,en,k,cnt,tmp,vis[MN],d[MN],q[MM*5],head[MN],rhead[MN]; struct edge { int v,w,next; }e[MM],re[MM];//一个正向,一个反向 struct A { int f,g,v; bool operator < (const A a)const { if(a.f==f) return a.g<g; return a.f<f; } }; void add(int u,int v,int w) { e[cnt].v=v; e[cnt].w=w; //正向邻接表 e[cnt].next=head[u]; head[u]=cnt; re[cnt].v=u; re[cnt].w=w; //反向邻接表,为求的是h(p)函数 re[cnt].next=rhead[v]; rhead[v]=cnt++; } void spfa() { int i,l=0,r=1,u,v,w; for(i=1;i<=n;i++) d[i]=INF; mem(vis,0); q[0]=en; d[en]=0; while(l<r) //模拟队列,如果用队列可能会RE { u=q[l++]; vis[u]=0; for(i=rhead[u];i!=-1;i=re[i].next) { v=re[i].v; w=re[i].w; if(d[v]>d[u]+w) { d[v]=d[u]+w; //更新每点的最短路,h(p)在本题中就是d数组 if(!vis[v]) { q[r++]=v; vis[v]=1; } } } } } int Astar() { priority_queue<A>Q; if(st==en) k++; //这句WA了一发,因为源点与终点相同时少了本身的一次,所以要加上 if(d[st]==INF) return -1; A s1,s2; s1.v=st; s1.g=0; s1.f=s1.g+d[st]; //即f(p)=g(p)+h(p) Q.push(s1); while(!Q.empty()) { s2=Q.top(); Q.pop(); if(s2.v==en) { tmp++; if(tmp==k) return s2.g; } for(int i=head[s2.v];i!=-1;i=e[i].next) { s1.v=e[i].v; s1.g=s2.g+e[i].w; s1.f=s1.g+d[s1.v]; Q.push(s1); } } return -1; } int main() { int i,u,v,w; scanf("%d%d",&n,&m); mem(head,-1); mem(rhead,-1); for(i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); } scanf("%d%d%d",&st,&en,&k); spfa(); printf("%d\n",Astar()); return 0; }
相关文章推荐
- pku 2449 Remmarguts' Date 第K短路模板题目
- 第k短路算法模板
- 单元最短路模板 dijistra
- <A*算法模板>poj 2449 第k短路
- poj 2449 A* +Dijkstra求第K短路(模板题)
- POJ 2449 Remmarguts' Date (第k短路 A*搜索算法模板)
- [jzoj1163]第k短路
- Dijkstra算法模板---单源最短路---目前最好理解的233
- poj 2387 最短路模板题
- 最短路模板Dijkstra Bellman-Ford Floyd SPFA
- POJ 2449 Remmarguts' Date(A* - 第K短路)
- poj 1125 Stockbroker Grapevine (Floyd最短路)【模板】
- 单源最短路spfa模板(stl更新版)
- 51Nod 迷宫问题(最短路+权值)(模板)
- 第K短路
- POJ--2449--Remmarguts' Date【dijkstra_heap+A*】第K短路
- uva_10740_Not the best(第k短路)
- HDU 2544 最短路 (模板题)
- 最短路--dijkstra+优先队列优化模板
- A*算法——第K短路