理解
好久没有学习新算法了,遇到这个A*确实有点懵。个人理解了一下,就是通过一个可以保证正确性的启发函数,和距离起点的真实值相加,得到一个排序值,这个排序值在保证取出值的正确性的情况下, 优化搜索顺序,来达到优化复杂度的目的。
例题
第K短路
注意开点顺序,思路如图所示。
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const int M = 10010;
int f[N],head[N],tmp[M][3],visited[N],dist[N];
int cnt,S,T,k;
struct Edge{
int to;
int dis;
int next;
}edge[M];
void ad(int fr,int to,int dis){
cnt ++;
edge[cnt].to = to;
edge[cnt].dis = dis;
edge[cnt].next = head[fr];
head[fr] = cnt;
}
struct Node{
int pos;
int dis;
bool operator < (const Node &x) const {
return x.dis < dis;
}
};
struct Nodee{
int dis_sort;
int pos;
int dis;
bool operator < (const Nodee & x) const {
return x.dis_sort < dis_sort;
}
};
void dijkstra(){
memset(f,0x3f,sizeof f);
f[T] = 0;
priority_queue <Node> q;
q.push(Node{
T,0});
while(! q.empty()){
Node fr = q.top();
q.pop();
if(visited[fr.pos]) continue;
visited[fr.pos] ++;
for(int i = head[fr.pos];i;i = edge[i].next){
if(fr.dis + edge[i].dis <