zoukankan      html  css  js  c++  java
  • A*寻路算法

    //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;
    }
    
  • 相关阅读:
    C语言-10-位域与共用体
    python-并发编程
    计算机操作系统
    网络编程-Socket
    网络编程-基础
    python-面向对象进阶
    python-面向对象
    python-模块分类与导入
    python-函数进阶
    python-函数内置方法
  • 原文地址:https://www.cnblogs.com/steady/p/1935817.html
Copyright © 2011-2022 走看看