求 \(1\) 到 \(n\) 的嚴格次短路
考慮使用 dij
記錄兩個陣列,dis[u],dis2[u]
分別表示 \(1\) 到 \(u\) 的最短路,嚴格次短路
更新時,取出堆頂的節點 \(u\),設它在堆種的距離大小是 \(now\_dis\)(不是那兩個陣列裡的值),遍歷所以和它相鄰的節點 \(v\)
然後就不像一般的 dij 每個點只更新一次了
#include#include#include#include#include#include#include#define reg register
#define en std::puts("")
#define ll long long
inline int read()
while(c>='0'&&c<='9')
return y?x:-x;
}#define n 5005
#define m 200005
struct graph
}g;int n,m;
struct dataheap[n*20];
int size;
int dis[n],dis2[n];
inline void push(data x)
}inline data pop());
push((data));
}else if(dis2[v]>nowdis+g.w[i]&&nowdis+g.w[i]>dis[v]));
}} }
}int main()
std::memset(dis,0x3f,sizeof dis);std::memset(dis2,0x3f,sizeof dis2);
dij();
printf("%d",dis2[n]);
return 0;
}