A*寻路算法

简介: //http://poj.org/problem?id=2449   #include #include #include #include using namespace std; typedef pair pii;//距离,顶点struct Arc{   ...

//http://poj.org/problem?id=2449

 
 
 
#include <iostream>
#include <utility>
#include <vector>
#include <queue>
using  namespace  std;
 
typedef  pair< int , int > pii; //距离,顶点
struct  Arc
{
     int  vex;
     int  weight;
};
 
const  int  MAX_VEX_NUM = 1010;
const  int  MAX = 1<<20;
 
vector<Arc> Adjlist[MAX_VEX_NUM];
vector<Arc> AdjlistRev[MAX_VEX_NUM]; //反向图,求h(n)
int  h[MAX_VEX_NUM];
 
int  S,T,K;
 
void  Init()
{
     int  N,M;
     int  A,B,T;
     cin>>N>>M;
     int  i;
     for (i = 0; i < N; i++)
     {
         Adjlist[i].clear();
         AdjlistRev[i].clear();
     }
     Arc arc;
     for (i = 0; i < M; i++)
     {
         cin>>A>>B>>T;
         arc.vex = B;
         arc.weight = T;
         Adjlist[A].push_back(arc);
         arc.vex = A;
         AdjlistRev[B].push_back(arc);
     }
     cin>>S>>::T>>K;
}
 
//计算h[n]
void  Dijkstra( int  u)
{
     priority_queue<pii, vector<pii>, greater<pii> > pq_dij;
     bool  traversed[MAX_VEX_NUM];
     memset (traversed, false , MAX_VEX_NUM * sizeof ( bool ));
     for ( int  i = 0; i < MAX_VEX_NUM; i++)
     {
         h[i] = MAX;
     }
     
     h[u] = 0;
     pq_dij.push(make_pair(h[u], u));
     while (!pq_dij.empty())
     {
         pii pq_node = pq_dij.top();
         pq_dij.pop();
         int  v = pq_node.second;
         if (traversed[v])
             continue ;
         traversed[v] = true ;
         for (vector<Arc>::iterator iter = AdjlistRev[v].begin(); iter != AdjlistRev[v].end(); iter++)
         {
             int  w = iter->vex;
             int  weight = iter->weight;
             if (h[w] > h[v] + weight)
             {
                 h[w] = h[v] + weight;
                 pq_dij.push(make_pair(h[w], w));
             }
         }
     }
}
 
int  Astar( int  s, int  t, int  k)
{
     priority_queue<pii, vector<pii>, greater<pii> > pq_astar;
     int  cnt[MAX_VEX_NUM];
     memset (cnt, 0, MAX_VEX_NUM * sizeof ( int ));
     pq_astar.push(make_pair(h[s], s));
     
     while (!pq_astar.empty())
     {
         pii node = pq_astar.top();
         pq_astar.pop();
         int  u = node.second;
         int  cost = node.first;
         cnt[u]++;
         if (cnt[t] == k)
             return  cost;
         if (cnt[u] > k)
             continue ;
         for (vector<Arc>::iterator iter = Adjlist[u].begin(); iter != Adjlist[u].end(); iter++)
         {
             int  v = iter->vex;
             int  weight = iter->weight;
             if (h[v] != MAX)
             {
                 pii adjArc = make_pair(cost - h[u] + weight + h[v], v);
                 pq_astar.push(adjArc);
             }
         }
     }
     return  -1;
}
 
 
int  main()
{
     //freopen("in.txt", "r", stdin);
 
     Init();
     Dijkstra(T);
 
     if (S == T)
         K++;
     cout<<Astar(S, T, K)<<endl;
     return  0;
}
目录
相关文章
|
算法
算法提高:计算几何基础 | 详解凸包问题
点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上,或者在其内
181 0
算法提高:计算几何基础 | 详解凸包问题
|
7月前
|
算法 C++ NoSQL
|
算法 算法框架/工具
图论算法实例分析|趣味象棋
图论(graph theory)是数学的一个分支,以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。
128 0
图论算法实例分析|趣味象棋
|
机器学习/深度学习 安全
洛谷P2245 星际导航(kruskal重构树)
洛谷P2245 星际导航(kruskal重构树)
120 0
|
存储 算法 定位技术
“ 探索迷局:解密广度寻路算法 “(一)
“ 探索迷局:解密广度寻路算法 “
|
算法 关系型数据库 MySQL
数据结构与算法——深度寻路算法
📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段,因为最近参加新星计划算法赛道(白佬),所以加快了脚步,果然急迫感会增加动力>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的 📖作者主页:king&南星 📖专栏链接:数据结构 🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​ 💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾 ———————————————— 版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
|
算法
基础算法练习200题09、水池注水
基础算法练习200题09、水池注水
166 0
基础算法练习200题09、水池注水
|
算法
什么是A*寻路算法?
A*寻路算法的介绍。
139 0
什么是A*寻路算法?
【算法提高——第三讲(二)】图论(1)
【算法提高——第三讲(二)】图论(1)
【算法提高——第三讲(二)】图论(1)
【算法提高——第三讲(一)】图论(2)
【算法提高——第三讲(一)】图论(2)
【算法提高——第三讲(一)】图论(2)