K短路(A 演算法)

2022-06-22 20:39:09 字數 1858 閱讀 8656

給乙個有向圖,求從a點到b點的第k短路(簡單路徑)

長度相同的路徑按照字典序排序

a*演算法是經過估價函式優化排序過的bfs演算法

估價函式為:\(f(n)=g(n)+h(n)\)

其中\(f(n)\)態經過狀態\(n\)到達最終狀態的代價估計,\(g(n)\)表示由初始狀態到達狀態\(n\)的實際代價,\(h(n)\)表示由狀態\(n\)到最終狀態的最佳方法的代價估計。

然後bfs時,通過使用估價函式來進行佇列優化,來達到類似於貪心的目的(有點像隊優dij的感覺)

第一次嘗試a*以及k短路,可能寫得挺醜...

題目中有乙個點專門用來卡a*,因此用了特判。

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define ll long long

#define mod 998244353

#define pi 3.1415926535898

#define inf 0x3f3f3f3f

#define maxn 10005

const double eps = 1e-8;

ll read()

ch = getchar();

} while (ch >= '0' && ch <= '9')

return w * x;

}ll k, a, b, n, m, s, wi, vi, ui, d[maxn], head[maxn], cnt, head1[maxn], cnt1;

struct node

;node edge[maxn * 2];//開雙倍大小

node edge1[maxn * 2];

void add1(ll x, ll y, ll z)

struct qnode

}now, qt;

priority_queueq;

qnode init(ll x, ll dis)

void add(ll x, ll y, ll z)

void dij(ll s)

d[s] = 0;

now.x = s;

now.dis = 0;

q.push(now);

while (!q.empty())

} }}

struct data1

};priority_queue qq;

ll cn[maxn];

int main()

for (register ll i = 1; i <= m; i++)

dij(b);

data1 tt;

tt.x = a;

tt.dis = 0;

tt.pre.push_back(a);

qq.push(tt);

bool flag = 1;

data1 now;

while (!qq.empty())

cout << endl;

break;

} for (register int i = head1[now.x]; i; i = edge1[i].next)

}if (!f)

continue;

tt.x = edge1[i].to;

tt.dis = now.dis + edge1[i].w;

tt.pre = now.pre;

tt.pre.push_back(tt.x);

qq.push(tt);

} }if (flag)

return 0;

}

第K短路(A 演算法)

對於無向圖 spfa a 演算法 先用spfa求目標結點到各個結點的最短路徑 然後,取g x 為從初始結點到當前結點x的路徑長度,h x 為從x結點到目標結點的最短路徑長度,即h x 取dis x 即可,估價函式f x g x h x 對於有向圖 spfa a 演算法 顯然應將有向邊取反,然後求目標...

第K短路(A (astar)演算法)

給定一張n個點 編號1,2 n m條邊的有向圖,求從起點s到終點t的第k短路的長度,路徑允許重複經過點或邊。注意 每條最短路中至少要包含一條邊。輸入格式 第一行包含兩個整數n和m。接下來m行,每行包含三個整數a,b和l,表示點a與點b之間存在有向邊,且邊長為l。最後一行包含三個整數s,t和k,分別表...

poj 2449 k短路 A 演算法

k短路的定義 1.如果起點終點相同,那麼0並不是最短路,而是要出去一圈回來之後才是最短路,那麼第k短路也是一樣。2.每個頂點和每條邊都可以使用多次。可以存在環和來回走 給定起終點,求k短路的長度 然後求k短路使用a 演算法,其估價函式f n g n h n h n 是終點到結點n的最短路徑,g n ...