實現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.核心演算法 ...