wenbao與次短路

2022-04-17 04:08:39 字數 1951 閱讀 9858

每次更新最短路的時候順便更新次短路 存在d 滿足 dis[i] < d&& d < dis2[i] 更新dis2[i] = d

也可以求兩次最短路(s到t,t到s),然後列舉每條不包含在最短路上的邊(次短路一定是替換了最短路的一條邊)

既然是次短路,那麼求解k短路的a*演算法當然也可以

親測a*相對而言快一點

1 #include 2 #include 3 #include 4

using

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 #include 

3 #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 3

using

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...