先看一眼原始dijkstra算法,参考自dijkstra算法C++实现_c++实现djikstra-CSDN博客
分为三步
题目大概是要从图上找一条权值不减的路径,且要经过最多的点。
所以用 Dijsktra 更新的原则是,1到该点的经过的点更多,则更新。
使用优先队列自动排序,排序的原则是:
附上大佬的代码
struct T {
int fi, se;
friend bool operator < (T x, T y) {
if (a[x.se] == a[y.se]) {
if (x.fi == y.fi) return x.se > y.se;
else return x.fi < y.fi;
}
else return a[x.se] > a[y.se];
}
};
void dijkstra() {
priority_queue<T> que;
que.push({1, 1}); d[1] = 1;
while (que.size()) {
T p = que.top(); que.pop();
int u = p.se, w = p.fi;
if (st[u]) continue;
st[u] = true;
for (auto v : e[u]) {
if (a[v] < a[u]) continue;
int nw = d[u] + (a[v] != a[u]);
if (nw > d[v]) {
d[v] = nw;
que.push({d[v], v});
}
}
}
cout << d[n] << "\n";
}