次短路模板题吧
题意已经非常裸了:求无向图的1到n次短路。
直接套用最短路(dijkstra)的主要框架。但在这个的基础上添加另外一个数组dist2
。
走到一条边的时候来三个判定:
dist[u] + weight < dist[v]
直接可以更新最短路,新的次短路就是曾经的最短路。dist[u] + weight > dist[v] && dist[u] + weight < dist2[v]
不可更新最短路,但可以更新次短路。dist2[u] + weight < dist2[v]
可以更新次短路。
然后就可以差不多写出来了。
话说这道题数据水。
代码:
```cpp
include
include
include
const int maxn = 5005, maxm = 100005;
struct Edges { int next, to, weight; } e[maxm << 1]; int head[maxn], tot; int dist[maxn], dist2[maxn];int n, m;
struct Heapnodes { int d, u; bool operator < (const Heapnodes &rhs) const { return d > rhs.d; } }; void link(int u, int v, int w) { e[++tot] = (Edges){head[u], v, w}; head[u] = tot; } void dijkstra(int s, int t) { memset(dist, 0x3f, sizeof dist); memset(dist2, 0x3f, sizeof dist2);// 0x7f??? std::priority_queue heap; dist[s] = 0; heap.push((Heapnodes){dist[s], s}); while(!heap.empty()) { Heapnodes x = heap.top(); heap.pop(); int d = x.d, u = x.u; if(d != dist[u]) continue; for(int i = head[u]; i; i = e[i].next) { int v = e[i].to; if(dist[u] + e[i].weight < dist[v]) { dist2[v] = dist[v]; dist[v] = dist[u] + e[i].weight; heap.push((Heapnodes){dist[v], v}); } if(dist[u] + e[i].weight > dist[v] && dist[u] + e[i].weight < dist2[v]) { dist2[v] = dist[u] + e[i].weight; heap.push((Heapnodes){dist[v], v}); } if(dist2[u] + e[i].weight < dist2[v]) { dist2[v] = dist2[u] + e[i].weight; //heap.push((Heapnodes){dist[v], v}); } } } } int main() { scanf("%d%d", &n, &m); while(m--) { int u, v, w; scanf("%d%d%d", &u, &v, &w); link(u, v, w); link(v, u, w); } dijkstra(1, n); printf("%d\n", dist2[n]); return 0; } ``