PAT甲級1003題解 Dijkstra

2022-06-06 05:00:07 字數 2037 閱讀 6120

解題步驟:

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

2.核心演算法:按照dijkstra演算法思想,從起點出發,不斷選擇乙個點使得通過該點到達其他點的距離比直接通過已知點到達的距離更短,則更新最短距離陣列dist,這裡分為兩種情況1:確實是通過某個點能使得到達其他點的距離更短,則除了修改最短距離陣列dist之外,此時通過該點為跳板達到點的行走方案數量就是到達該跳板點的行走方案數量,而到達該點的人數就是到達跳板點的人數加上該點本來就有的人數。(因為人數是必須以最短距離為基礎的,只要有更短的距離,則人數就要修改成那種方案下的人數)2:如果通過選中的點到達其他點的距離和原本已知點達到該點的距離是相等的,則需要增加到達該點的行走方案的總數,以及可能要修改同樣是到達該點的時最多可召集的救援隊的數量。方案增加的方法是原來到x點的走法數量加上到達跳板點的走法的數量,而人數的修改則是選取原來方案到x的人數和到達跳板點最多人數+x點的人數二者之間的最大值

3.注意點:對於初始化的時候,我們要注意的是除了設定所有從起點開始不可達的點的距離為無窮大(0x3f3f3f3f)之外, 我們巧妙的設定初始點到自己的距離為0,通過這樣的方式,第乙個選中的跳板是出發點自身,則會為man,num陣列進行一遍賦值,這樣後續的核心演算法的判斷和修改過程才能成立

1 #include2 #include

3using

namespace

std;45

const

int max = 0x3f3f3f3f;6

const

int n = 505;7

intmat[n][n];

8int dist[n]; //

記錄隨著每次獲取乙個新的點之後從起點開始到每個點的最短距離的最新情況

9int people[n]; //

記錄每個城市初始的救援隊的人數

10int num[n]; //

記錄從起點開始到達某個點的最短路徑的條數

11int man[n]; //

記錄從起點開始在最短路徑的基礎上到達某個城市的最多的人數

12int vis[n]; //

記錄某個城市是否被走過 1走過 0未走過

13int

n, m, s, t;

1415

void

init()

27 mat[s][s] = 0; //

設定到達自己本身為0 則第一次必定會選擇自己

28for(int i = 0; i < n; i++)

31 num[s] = 1; //

設定初始到達起點的走法有1條

32 man[s] = people[s]; //

設定到達起點的可以召集的人數為起點的人數 33}

3435

intsearch()43}

44//

因為至少存在一條通路所以k的返回值不可能是-1 (若圖是不連通的則某個時刻k會返回-1)

45return

k;46}47

48void

run()

58//

這裡必須要用else if因為執行完上面的語句之後 dist[j] == mat[k][j] + dist[k]必定會成立則會導致再次執行下面的語句

59else

if(vis[j] == 0 && dist[j] == mat[k][j] +dist[k])63}

64}65 printf("

%d %d\n

", num[t], man[t]);66}

6768

intmain()

73return0;

74 }

PAT甲級題解目錄

寫在前面 9月8號剛參加了第一次pat甲級考試,成績還算是滿意。但是沒有滿分,算是有一點小遺憾,於是打算12月再來一次,但是這次採用佛系備考與吃老本的複習方法 畢竟初試重要啊 為了記錄一下成長歷程和各題要點,順便做乙個部落格題解,也給有需要的戰友們提供乙個參考吧。本部落格純屬個人記錄與經驗分享,不帶...

PAT甲級題解1004

注意的是m代表的是the number of non leaf nodes 要看清楚題意,一開始把n m認為是輸入的行數了 利用vector特性 題意大致是尋找每層葉結點的個數,dfs遍歷這棵樹,遍歷時統計即可。include using namespace std const int maxn 1...

PAT甲級題解 1021

先判斷有幾個連通塊嗎,因為已經滿足邊的個數等於頂點個數減1所以一定是一棵樹,只要是1.本來用的是優先佇列,最後發現沒過,其實是error k components 少了個s看題目一定要仔細 include using namespace std const int maxn 10100 vector...