第K短路(A*算法)
来源:互联网 发布:c语言多线程并行案例 编辑:程序博客网 时间:2024/06/06 17:01
对于无向图:
SPFA+A*算法:先用SPFA求目标结点到各个结点的最短路径;然后,取g(x)为从初始结点到当前结点x的路径长度,h(x)为从x结点到目标结点的最短路径长度,即h(x)取dis[x]即可,估价函数f(x)=g(x)+h(x)。
对于有向图:
SPFA+A*算法:显然应将有向边取反,然后求目标节点到各个结点的最短路径;后面和上述一样。
代码:
struct node{ int u; int w; node (int uu,int ww):u(uu),w(ww){}};void SPFA(int t){ int i; for(i=0;i<=n;i++) { dis[i]=inf; vis[i]=0; } dis[t]=0; queue<int>que; que.push(t); vis[t]=1; while(!que.empty()) { int u=que.front(); que.pop(); vis[u]=0; for(i=0;i<g[u].size();i++) { node b=g[u][i]; int v=b.u; if(dis[v]>dis[u]+b.w) { dis[v]=dis[u]+b.w;if(!vis[v]) { vis[v]=1; que.push(v);} } } }} struct cnode{ int u; int len; cnode (int uu,int ww):u(uu),len(ww){} friend bool operator < (cnode a,cnode b)//重载比较运算符 { return a.len+dis[a.u]>b.len+dis[b.u];//g(x)=a.len,h(x)=dis[a.u] }};int A_star(int s){ int i; if(dis[s]==inf)return -1;//若s到t不连通的话,提前终止 priority_queue<cnode>que; memset(cnt,0,sizeof(cnt)); que.push(cnode(s,0)); while(!que.empty()) { cnode a=que.top();que.pop(); int u=a.u; int len=a.len; cnt[u]++; if(cnt[t]==k) return len;//k=1,最短路,k=n,第k短路 for(i=0;i<g[u].size();i++) { node b=g[u][i]; int v=b.u; que.push(cnode(v,len+b.w)); } } return -1;}
阅读全文
0 0
- 第K短路(A*算法)
- A*算法—第K短路
- poj2449 第k最短路,A*算法
- A*算法——第K短路
- 求图的第K短路(A*算法与最短路的应用)
- A* && 第k短路详解 (详尽)
- poj2449-A*算法+优先队列+第k最短路
- <A*算法模板>poj 2449 第k短路
- pku2449第K短路 最短路+A*
- poj2449 第k短路....A*+最短路
- 第k短路算法模板
- 图论算法(3)--- A*算法求k短路
- poj 2449 Remmarguts' Date(第K短路 A*)
- poj 2449 Remmarguts' Date(A*求第K短路)
- poj 2449 (第K短路) A* + dij
- POJ 2449 Remmarguts' Date(A* - 第K短路)
- poj 2449 Remmarguts' Date(第K短路 A*)
- poj_2449 Remmarguts' Date(第k短路+Dijkstra+A*)
- 分布式事务-例子讲解
- 606. Construct String from Binary Tree
- IDEA快捷键设置成eclipse快捷键
- 洛谷P2516 [HAOI2010]最长公共子序列
- symbol类型
- 第K短路(A*算法)
- 枚举类型
- 2017年8月9日训练日记
- 16*64LED点阵屏静态显示、 动态向左滚动显示 基础万年历源码
- python中僵尸进程
- 登录页面设计
- final 与static
- c++入门教程(六)
- 题目242-计算球体积