給乙個有向圖,求從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 ...