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