第一次接觸a*,感覺好神奇。。
啟發函式:f(x) = g(x) + h(x);
比如初始狀態為s,目標狀態為t
g(x)表示從s到達狀態x所消耗的代價
h(x)表示從x到達t所估算的代價
g'(x)表示s -> x可能出現的最小代價
h'(x)表示x -> t可能出現的最小代價
g(x) >= g'(x);h(x) <= h'(x);
好吧,上面全是概念。。。
當g(x) 為0時,a*就成了bfs,當h(x)為0時,a*就成了dfs。所以。。。啟發函式的選擇直接影響到a*演算法的效能。
大概的說說我對a*演算法運算過程的理解吧:
基本就是bfs形式,不過要用到優先佇列。
如在求第k短路問題上:f(x)越小優先順序越高。dis[x]表示x到t的最短路,這裡可以用spfa預處理出來(把圖逆向,求t到每個點的距離就ok了)。bfs過程中每次更新f(x)和g(x)
f(x) = [pre]g(x) + curent.value + dis[curnet.node];
[new]g*(x) = [pre]g(x) + curent.value.
比如:poj 2499
模板如下:
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define cl(arr, val) memset(arr, val, sizeof(arr))
#define rep(i, n) for((i) = 0; (i) < (n); ++(i))
#define for(i, l, h) for((i) = (l); (i) <= (h); ++(i))
#define ford(i, h, l) for((i) = (h); (i) >= (l); --(i))
#define l(x) (x) << 1
#define r(x) (x) << 1 | 1
#define mid(l, r) (l + r) >> 1
#define min(x, y) x < y ? x : y
#define max(x, y) x < y ? y : x
#define e(x) (1 << (x))
const
double eps = 1e-4
;typedef
long
long
ll;using
namespace
std;
const
int n = 1024
;const
int m = 100010
;const
int inf = ~0u>>2
;struct
edg
edg(
int a, int b, int
c): to(a), val(b), next(c) {}
} g[m
<<1], rg[m<<1
];struct
node
node(
int a, int b, int
c) : f(a), g(b), v(c) {}
bool
operator
< (const node& x) const
};int
inq[n];
inthead[n];
intrhead[n];
intdis[n];
intt, k;
void
init()
void add(int u, int v, int
w) void spfa(int
ed) }}
inq[u] = 0
; q.pop();
}}int a_star(int st, int
ed)
}return -1;}
intmain()
scanf(
"%d%d%d
", &st, &ed, &k);
spfa(ed);
if(st == ed) k++;
printf(
"%d\n
", a_star(st, ed));
return0;
}
參考: 這個很全。。。
第K短路 嚴格第K短路
所謂k短路,就是從s到t的第k短的路,第1短就是最短路。如何求第k短呢?有一種簡單的方法是廣度優先搜尋,記錄t出佇列的次數,當t第k次出佇列時,就是第k短路了。但點數過大時,入佇列的節點過多,時間和空間複雜度都較高。a 是在搜尋中常用的優化,一種啟發式搜尋。簡單的說,它可以用公式表示為f n g n...
第K短路(A 演算法)
對於無向圖 spfa a 演算法 先用spfa求目標結點到各個結點的最短路徑 然後,取g x 為從初始結點到當前結點x的路徑長度,h x 為從x結點到目標結點的最短路徑長度,即h x 取dis x 即可,估價函式f x g x h x 對於有向圖 spfa a 演算法 顯然應將有向邊取反,然後求目標...
第K短路(模板)
沒太想明白 就當存在模板吧 include include include include include include include include include include using namespace std typedef long long ll const int maxn ...