題意:給你無向帶權圖,求次短路徑
題解:加乙個次短路的陣列,用於距記錄源點到此點的次短路長度,注意初始化是源點到自己的次短路是極大值
接著再使用dijkstra演算法,它是每次選用現在連上(記錄了)的點與其他點的最小權值的邊去更新其他所有的點
就是在dij的演算法上進行簡單的修改,需要修改的是每次最短路更新之後再更新次短路,但是保證更新的次短路大於記錄的次短路並小於記錄的最短路
#include#include#include
#include
using
namespace
std;
const
int inf=1
<<29
;const
int maxn=200010
;struct
edge
bool
operator
< (const edge &c)const
//改寫大頂堆成為小頂堆
};vector
vec[maxn];
int dis[maxn],secondis[maxn];//
記錄第二短路徑
void init(intn)}
void dijkstrasecond(int n,int
s)
//secondis[s]=0;
//不能初始化
dis[s]=0
; pque.push(edge(s,
0));
while(!pque.empty())
if(secondis[ende.v]>disnow&&dis[ende.v]//
鬆弛次短路}}
}int
main()
dijkstrasecond(n,1);
//for(int i=1; i<=n; ++i)
// printf("
%d\n
",secondis[n]);
}return0;
}
POJ3255次短路模板
模板級次短路問題 與最短路的區別在於,優先佇列儲存的物件不同,佇列中同時儲存了 1 到某個點u的最短路 u到v的邊 2 到某個點u的次短路 u到v的邊 用這兩種情況重新整理最短路和次短路,所以temp x.d edge i dist include include include include i...
POJ 3255 次段路徑模板
次最短路徑模板 我們可以知道從a b的次短路徑,是a c的最短加上c b,或者是a b的次短加上c b。這其實可以想象成為,我們用djkstra演算法的時候,每次更新滾動的是,最小值,那麼肯定就有原來的值被拋棄掉,我們將被拋棄的值記錄下來,這是上乙個的最優解,之比當前最優解稍微差了一些。這樣就能找到...
POJ3255(次小生成樹)
次小生成樹裸題 到某個點的次小次短路要麼是其它某個點u的最短路加上u v的邊,要麼就是到u的次短路加上u v的邊,因此所需要求的就是到所有頂點的最短路和次短路 include include include include include using namespace std const int ...