第k短路和A

2021-09-06 05:21:35 字數 2338 閱讀 7885

第一次接觸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 ...