最短路和次短路問題,dijkstra演算法

2022-03-14 18:03:27 字數 2089 閱讀 4129

1/*2

*題目大意:

3*在乙個有向圖中,求從s到t兩個點之間的最短路和比最短路長1的次短路的條數之和; 4*

5*演算法思想:

6*用a*求第k短路,目測會超時,直接在dijkstra演算法上求次短路;

7*將dist陣列開成二維的,即dist[v][2],第二維分別用於記錄最短路和次短路;

8*再用乙個cnt二維陣列分別記錄最短路和次短路的條數;

9*每次更新路徑的條數時,不能直接加1,,應該加上cnt[u][k],k為次短路徑或者最短路徑的標記;

10*圖有重邊,不能用鄰接矩陣儲存;

11*不知道為什麼,題目上說的是n and m, separated by a single space, with 2≤n≤1000 and 1 ≤ m ≤ 10000;

12*而我的**硬是把n開成1w了才過,求解釋,re了無數次,擦; 13*

*/14 #include

15 #include

16 #include

17 #include

18 #include

19using

namespace

std; 

2021

const

int n=11111

;  22

const

int m=111111

;  23

const

int inf=0xffffff

;  24

25struct

node 

26; 

3132

node edge[n]; 

33int

head[n]; 

3435

int dist[n][2],cnt[n][2

]; 

36bool vis[n][2

]; 

37int

n,m,s,t,edges; 

3839

void addedge(int u,int v,int

w) 

40 

4647

intdijkstra() 

48 

56     cnt[s][0]=1,dist[s][0]=0

;  57

58for(int i=1; i<=n*2; i++) 

59 

70if(u==-1

)  71

break

;  72         vis[u][k]=true

;  73

for(int e=head[u]; e!=-1; e=edge[e].next) 

74 

8586

else

if(tmp==dist[j][0])//

tmp等於最短路徑長: 

87 

9091

else

if(tmp1])//

tmp大於最短路徑長且小於次短路徑長: 

92 

9697

else

if(tmp==dist[j][1])//

tmp等於次短路徑長: 

98 

101} 

102} 

103104

int res=cnt[t][0

]; 

105if(dist[t][0]+1==dist[t][1])//

判斷最短路和次短路是否相差1 

106         res+=cnt[t][1

]; 

107return

res; 

108} 

109110

intmain() 

111 

126         scanf("

%d%d

",&s,&t); 

127         printf("

%d\n

",dijkstra()); 

128} 

129return

0; 

130 }

最短路 最短路徑問題

題目描述 平面上有n個點 n 100 每個點的座標均在 10000 10000之間。其中的一些點之間有連線。若有連線,則表示可從乙個點到達另乙個點,即兩點間有通路,通路的距離為兩點直線的距離。現在的任務是找出從一點到另一點之間的最短路徑。input 共有n m 3行,其中 第一行為乙個整數n。第2行...

最短路與次短路計數

poj 3464 問最短路的條數 比最短路權值大 1 的條數 做法 比較一下次短路和最短路的值 若次短路恰好比最短路大1,答案為最短路 次短路條數,否則答案就是最短路條數 1 include2 const int inf 0x3f3f3f3f 3 class count short path e m...

計算最短路和次短路條數

題目 題意 在給定有向圖中查詢最短路與次短路,如果 最短路 1 次短路 則輸出 最短路條數 次短路條數 否則只輸出最短路條數。思路 在最短路的鬆弛操作上做些判斷和記錄即可,具體看 吧 有注釋 include include include include include include includ...