次短路问题

本文介绍了一种使用Dijkstra算法求解图中两点之间的次短路径的方法。通过维护最短路径和次短路径,并利用优先队列进行节点间的距离更新,可以有效地找到次短路径。此方法适用于带权图,特别是非负权重的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本的想法:删掉最短路上的一条边,然后不断寻找最短路,这样每次的复杂度是O(n^2),删掉边是O(n)次,所以总的是O(n^3)

Dijkstra的想法:记录最短路和次短路,每次用这个最短路和次短路更新周围的点。(这样做的想法是:次短路要么是u-v的次短路加上v到e的最短路,或者是到某个点的最短路加上次短路)


  • #define N 100000+10
      
  • #define INF 100000000  
  • typedef pair<intint>P;  
  • int n,r;  
  • struct Edge{ int to, cost; };  
  • vector<Edge>G[N];  
  • int dist[N], dist2[N];  
  • void addedge(int u, int v,int w)  
  • {  
  •     G[u].push_back(Edge{ v, w });  
  •     G[v].push_back(Edge{ u, w });  
  • }  
  • void solve()  
  • {  
  •     priority_queue<P, vector<P>, greater<P> >q;  
  •     fill(dist, dist + n, INF);  
  •     fill(dist2, dist2 + n, INF);  
  •     dist[0] = 0;  
  •     q.push(P(0, 0));  
  •     while (!q.empty())  
  •     {  
  •         P u = q.top(); q.pop();  
  •         int v = u.second, d = u.first;  
  •         if (dist2[v] < d)continue;//取出的不是次短距离,抛弃  
  •         for (int i = 0; i < G[v].size(); i++)  
  •         {  
  •             Edge&e = G[v][i];  
  •             int d2 = d + e.cost;  
  •             if (dist[e.to]>d2)//更新最短距离  
  •             {  
  •                 swap(dist[e.to], d2);  
  •                 q.push(P(dist[e.to], e.to));  
  •             }  
  •             if (dist2[e.to]>d2&&dist[e.to] < d2)//更新次短距离  
  •             {  
  •                 dist2[e.to] = d2;  
  •                 q.push(P(dist2[e.to], e.to));  
  •             }  
  •         }  
  •     }  
  •     printf("%d\n", dist2[n - 1]);  
  • }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值