PAT 1003 Emergency 統計最短路徑

2021-10-14 16:00:45 字數 2372 閱讀 4095

實現2: 用dijkstra求最短路的同時計數

原題鏈結

題目大概是要求出無向圖中的最短路徑條數, 還要求出所有最短路當中, 經過點的權值之和的最大值

題目資料量最大為500個點, 資料量較小, 可以進行dfs

// 500個點, 直接深搜

#include

#include

#include

#include

using

namespace std;

const

int n =

509;

const

int inf =

0x3f3f3f3f

;int n, m, s, e;

int num[n]

;// 各個點的權值

int map[n]

[n];

int vis[n]

;int cnt, ans, min_dis;

// 最短路徑條數, 最短路徑所經點的權值之和的最大值, 最短路徑

void

dfs(

int pos,

int dis,

int count)

// 當前所處頂點, 路徑長度, 路徑所經點的權值之和

else

if(dis == min_dis)

return;}

for(

int i=

0; i

return;}

intmain()

memset

(map,

0x3f

,sizeof

(map));

for(

int i=

0; i

) vis[s]=1

; min_dis = inf;

dfs(s,

0,num[s]);

cout << cnt <<

" "<< ans << endl;

return0;

}

如何求最短路的同時計數?

對於dijkstra而言, 就是在鬆弛的同時進行計數

詳見下段**:

// ans 記錄的是從各點到源點的最短路徑條數

// cnt 是本題讓求的多條最短路徑中,經過點的權值之和的最大值

for(

int j=

0; j

)else

if(dist[j]

== map[id]

[j]+ mind)

// 如果j到源點的距離 = 從中介點id到j的最短距離 + 從id到源點的最短距離

// 那麼j到源點的最短路徑數 就要加上 中介點id到源點的最短路徑數

}}

#include

#include

#include

#include

using

namespace std;

const

int n =

509;

const

int inf =

0x3f3f3f3f

;int n, m, s, e;

int map[n]

[n];

int vis[n]

, dist[n]

, num[n]

, ans[n]

, cnt[n]

;// 依次為 是否已訪問 到源點的最短距離 該點的權值, 到源點的最短路徑數 從n出發到源點的最短路徑上經過的點的權值之和

void

dijkstra()

} vis[id]=1

;for

(int j=

0; j

)else

if(dist[j]

== map[id]

[j]+ mind)}}

}}intmain()

memset

(map,

0x3f

,sizeof

(map));

for(

int i=

0; i

)dijkstra()

; cout << ans[e]

<<

" "<< cnt[e]

<< endl;

return0;

}

(自用隨筆)PAT A1003 Emergency

include include define maxn 100000000 int n,m,c1,c2 int wei 505 int w 505 到點v的最大點權之和 int g 505 505 int num 505 到點v的最短路徑條數 int d 505 int vis 505 void d...

PAT乙級 1003 數素數

時間限制 1000 ms 記憶體限制 32768 kb 長度限制 100 kb 判斷程式 standard 來自 小小 令pi表示第i個素數。現任給兩個正整數m n 10000,請輸出pm到pn的所有素數。輸入在一行中給出m和n,其間以空格分隔。輸出從pm到pn的所有素數,每10個數字佔1行,其間以...

PAT甲級1003題解 Dijkstra

解題步驟 1.初始化 設定mat存放點之間的距離,vis存放點的選取情況,people存放初始時每個城市的人數,man存放到達每個城市的救援隊的最多的人數,num存放到達每個城市的最多的人數 在最短路徑的基礎之上 dist存放從起點開始到達每個城市的最短的路徑 隨著每次選取點而更新 2.核心演算法 ...