每次更新最短路的時候順便更新次短路 存在d 滿足 dis[i] < d&& d < dis2[i] 更新dis2[i] = d
也可以求兩次最短路(s到t,t到s),然後列舉每條不包含在最短路上的邊(次短路一定是替換了最短路的一條邊)
既然是次短路,那麼求解k短路的a*演算法當然也可以
親測a*相對而言快一點
1 #include 2 #include 3 #include 4using
namespace
std;
5#define pri pair6
const
int inf =1e9;
7const
int maxn = 5009
;8 vectorv[maxn];
9int
n, r, x, y, z, dis[maxn], dis2[maxn];
10void
d()26
if(dis[vv] < d && dis2[vv] >d)30}
31}32 printf("
%d\n
", dis2[n]);33}
34int
main()
41d();
42return0;
43 }
兩次最短路
1 #include 2 #include3 #include 4 #include 5
using
namespace
std;
6#define inf 1e9;
7const
int maxn = 5009;8
int n, m, from
, to, val, d1[maxn], dn[maxn];
9bool
mark[maxn];
10 vectora[maxn];
11 vectorb[maxn];
12void spfa(int s, int t, int
t)27}28
}29}30
void
solve()37}
38 printf("
%d\n
", mi);39}
40int
main()
49 spfa(1
, n, d1);
50 spfa(n, 1
, dn);
51solve();
52return0;
53 }
a*
1 #include 2 #include 3using
namespace
std;45
#define inf 1e9;
6const
int maxn = 200003;7
int n, m, to[maxn], w[maxn], pre[maxn], p[5003], index = 1, t[5003];8
bool mark[5003];9
10struct
node
15};
1617
void
solve()32}
33}34 priority_queuepq;
35int cnt = 0;36
node a, b;
37 a.v = 1, a.dis = 0;38
pq.push(a);
39while(!pq.empty())47}
48for(int i = p[v]; i; i =pre[i])52}
53}5455
intmain()
63solve();
64return0;
65 }
只有不斷學習才能進步!
wenbao與最短路(spfa)
spfa就是利用鄰接表和佇列進行優化的最短路!牛!利用spfa判斷圖中的負環 如果乙個點入隊次數超過n則存在負環 1 include 2 include 3 include 4 include 5 using namespace std 6const int maxn 1010 7 int n,m,...
wenbao與最短路(Floyd)
floyd演算法堪稱經典。僅僅五行 就可以求出多源最短路,建議好好思考為什麼可以這樣求 注意點 中轉點k在最外層迴圈,這樣可以確保 i k k j 最小 1 for k 1 n 2for i 1 n 3for j 1 n 4若i,j,k各不相同 5 mindistance i,j min 1 for...
wenbao與多源多匯最短路
求多個起點多個終點的最短路,與dij求單源最短路相似,將起點集push進入優先佇列,終點集標記,最先遇到的就是最短路 在乙個集合中找出兩個點距離最短,二進位制列舉起點集與終點集,目的是使每個點與其他點不再乙個集合當中 巧妙利用二進位制位實現 1 include 2 include 3 include...