Poj 2449 Remmarguts' Date (第k短路)
2013-07-08 22:35
483 查看
题目链接:http://poj.org/problem?id=2449
题意:求第k短路
思路:A*启发式搜索。
从网上看的方法,还没有完全理解。
第K短路 - - ITeye技术网站
http://yzmduncan.iteye.com/blog/1162759
POJ 2449 A* K短路 - 梦想起航的地方 - 博客频道 - CSDN.NET
http://blog.csdn.net/mbxc816/article/details/7197228
题意:求第k短路
思路:A*启发式搜索。
从网上看的方法,还没有完全理解。
第K短路 - - ITeye技术网站
http://yzmduncan.iteye.com/blog/1162759
POJ 2449 A* K短路 - 梦想起航的地方 - 博客频道 - CSDN.NET
http://blog.csdn.net/mbxc816/article/details/7197228
#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; #define min(x,y) ((x)<(y)?(x):(y)) #define max(x,y) ((x)>(y)?(x):(y)) const int INF = 0x3fffffff; //权值上限 const int MAXPT = 1010; //顶点数上限 const int MAXEG = 100000+200; //边数上限 //点存储1~n class Dijkstra /*邻接表 + 优先队列 + Dijkstra求最短路*/ { private: int n,e,e1; int dis[MAXPT],head[2][MAXPT]; int visit[MAXPT]; int cnt[MAXPT]; //启发式搜索标记 struct Node { int v,dis,h; Node () {} Node (int _v,int _dis,int _h) { v=_v; dis=_dis; h=_h; } bool operator < (const Node a) const { return dis+h>a.dis+a.h; } }; struct Edge { int v, w, next; Edge () {} Edge (int _v, int _next, int _w) { v=_v; next=_next; w=_w; } }edges[2][MAXEG]; //0存储原图,1存储反图 public: inline void init (int vx) { n = vx; e = 0,e1=0; memset(head[0],-1,sizeof(int) * (vx + 1)); memset(head[1],-1,sizeof(int) * (vx + 1)); } inline void Add (int u, int v, int w) { edges[0][e] = Edge(v, head[0][u], w); head[0][u] = e++; } inline void Add1 (int u, int v, int w) { edges[1][e1] = Edge(v, head[1][u], w); head[1][u] = e1++; } void dijkstra (int src) { Node first, next; priority_queue <Node> Q; for (int i=0;i<=n;i++) { dis[i] = INF; visit[i] = false; } dis[src]=0; Q.push (Node(src, 0,0)); while (!Q.empty()) { first = Q.top(); Q.pop(); visit[first.v] = true; for (int i=head[1][first.v] ; i!=-1 ; i=edges[1][i].next) { if (visit[edges[1][i].v]) continue; next = Node(edges[1][i].v, first.dis + edges[1][i].w,0); if (next.dis < dis[next.v]) { dis[next.v] = next.dis; Q.push(next); } } } } int Astar_Kth (int src,int end,int K) { Node first, next; priority_queue <Node> Q; memset (cnt,0,sizeof(cnt)); if (dis[src]==INF) return -1; if (src==end) K++; //注意当s==t时需要计算K+1短路,因为s到t这条距离为0的路不能算在这K短路中,这时只需将K++ Q.push (Node(src,0,dis[src])); while (!Q.empty()) { first = Q.top(); Q.pop(); cnt[first.v]++; if (cnt[first.v]>K) continue; if (cnt[end]==K) return first.dis; for (int i=head[0][first.v] ; i!=-1 ; i=edges[0][i].next) Q.push(Node(edges[0][i].v,first.dis+edges[0][i].w,dis[edges[0][i].v])); } return -1; } }ob; int main () { #ifdef ONLINE_JUDGE #else freopen("read.txt","r",stdin); #endif int n,m,s,e,k; while (~scanf("%d%d",&n,&m)) { ob.init(n); while (m--) { int u,v,w; scanf("%d%d%d",&u,&v,&w); ob.Add(u,v,w); ob.Add1(v,u,w); } scanf("%d%d%d",&s,&e,&k); ob.dijkstra(e); printf("%d\n",ob.Astar_Kth(s,e,k)); } return 0; }
相关文章推荐
- poj 2449 Remmarguts' Date(第K短路 A*)
- POJ--2449--Remmarguts' Date【dijkstra_heap+A*】第K短路
- Remmarguts' Date----POJ_2449----第k最短路
- poj2449 Remmarguts' Date,第K短路
- 【A* + 第K短路】 poj2449 Remmarguts' Date
- POJ 2449 Remmarguts' Date 第K短路 A* + SPFA
- [第K短路]POJ_2449_Remmarguts' Date
- [POJ 2449] Remmarguts' Date 第K短路
- poj 2449 Remmarguts' Date 求第k短路(SPFA+A*)
- POJ 2449 Remmarguts' Date 第K短路 A*
- POJ 2449 Remmarguts' Date(A* - 第K短路)
- POJ--2449--Remmarguts' Date【dijkstra_heap+A*】第K短路
- POJ 2449 Remmarguts' Date (第k短路 A*搜索算法模板)
- poj 2449 Remmarguts' Date(A*求第K短路)
- poj 2449 Remmarguts' Date(A*+Dijsktra 求第K短路)
- POJ 2449 Remmarguts' Date (第k短路)
- 【解题报告】POJ 2449 Remmarguts' Date -- 有向图第k短路(有重边)
- [A* K短路] POJ 2449 Remmarguts' Date
- POJ 2449 Remmarguts' Date(k短路)
- poj2449 Remmarguts' Date(K短路:A*算法)