PTA練習題 旅遊規劃

2021-10-07 09:07:13 字數 1450 閱讀 1325

有了一張自駕旅遊路線圖,你會知道城市間的高速公路長度、以及該公路要收取的過路費。現在需要你寫乙個程式,幫助前來諮詢的遊客找一條出發地和目的地之間的最短路徑。如果有若干條路徑都是最短的,那麼需要輸出最便宜的一條路徑。

輸入格式:

輸入說明:輸入資料的第1行給出4個正整數n、m、s、d,其中n(2≤n≤500)是城市的個數,順便假設城市的編號為0~(n−1);m是高速公路的條數;s是出發地的城市編號;d是目的地的城市編號。隨後的m行中,每行給出一條高速公路的資訊,分別是:城市1、城市2、高速公路長度、收費額,中間用空格分開,數字均為整數且不超過500。輸入保證解的存在。

輸出格式:

在一行裡輸出路徑的長度和收費總額,數字間以空格分隔,輸出結尾不能有多餘空格。

輸入樣例:

4 5 0 3

0 1 1 20

1 3 2 30

0 3 4 10

0 2 2 20

2 3 1 20

輸出樣例:

3 40

思路:本題採用迪傑斯特拉演算法,建立圖要建立無向圖。

迪傑斯特拉演算法(求第 i 點到其他點的最短路徑)步驟:

①將鄰接矩陣第 i 行資料全部放入輔助陣列d中

②在輔助陣列d中選擇乙個最小的值min,對應下標為index(下標代表城市)並將isvisited[index] = true 標記為已訪問。

③在鄰接矩陣第 index 行中,找出與 index 相連通的點 j(除去出發點 i 和 index點),然後判斷 鄰接矩陣[index][j] + min <= d[index] 是否成立,若是則 d[index] = 鄰接矩陣[index][j] + min。

④重複②③,知道全部節點訪問

#include#include#define max_value 1000000

typedef struct cities

cities;

void inital(cities *p); // 初始化

void dijkstra(cities *p,int s); // 迪傑斯特拉演算法

int main()

dijkstra(p,s);

printf("%d %d",p->d[0][d],p->d[1][d]);

return 0;

}void dijkstra(cities *p,int s)

p->isvisited[s] = 1;

while(1)

}if(min == -1)

p->isvisited[min] = 1;

for(int i = 0;i < p->n;i++)

}else

}} }}

void inital(cities *p)

}}

PTA 演算法練習題 回溯

1.最佳排程問題 假設有n n 20 個任務由k k 20 個可並行工作的機器完成。完成任務i需要的時間為ti。試設計乙個演算法,對任意給定的整數n和k,以及完成任務i 需要的時間為ti i 1 n。計算完成這n個任務的最佳排程,使得完成全部任務的時間最早。輸入格式 輸入資料的第一行有2 個正整數n...

PTA練習題 樹的同構

在網上做了一道簡單的練習題,判斷兩棵樹是否同構 題目描述 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。輸入格式 輸入給出2棵...

PTA的Python練習題(十六)

第4章 15 換硬幣 挺難的,這裡學到乙個range的用法 也就是說range函式能實現順序和倒序,取決於step是正是負 count 0 x int input a x 5 for m in range a,0,1 b x m 5 2 for n in range b,0,1 c x 5 m 2 ...