P2865 Roadblocks(嚴格次短路)

2022-02-27 08:42:25 字數 950 閱讀 5591

求 \(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;

}