-
當(dāng)前位置:首頁(yè) > 創(chuàng)意學(xué)院 > 技術(shù) > 專題列表 > 正文
如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))
大家好!今天讓創(chuàng)意嶺的小編來(lái)大家介紹下關(guān)于如何求最短路徑的問(wèn)題,以下是小編對(duì)此問(wèn)題的歸納整理,讓我們一起來(lái)看看吧。
開始之前先推薦一個(gè)非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計(jì)劃、工作報(bào)告、論文、代碼、作文、做題和對(duì)話答疑等等
只需要輸入關(guān)鍵詞,就能返回你想要的內(nèi)容,越精準(zhǔn),寫出的就越詳細(xì),有微信小程序端、在線網(wǎng)頁(yè)版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務(wù)客戶遍布全球各地,如需了解SEO相關(guān)業(yè)務(wù)請(qǐng)撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、求A到B之間的最短路徑,怎么獲取
問(wèn)題:從某頂點(diǎn)出發(fā),沿圖的邊到達(dá)另一頂點(diǎn)所經(jīng)過(guò)的路徑中,各邊上權(quán)值之和最小的一條路徑——最短路徑。解決最短路的問(wèn)題有以下算法,Dijkstra算法,Bellman-Ford算法,F(xiàn)loyd算法和SPFA算法,另外還有著名的啟發(fā)式搜索算法A*,不過(guò)A*準(zhǔn)備單獨(dú)出一篇,其中Floyd算法可以求解任意兩點(diǎn)間的最短路徑的長(zhǎng)度。任意一個(gè)最短路算法都是基于這樣一個(gè)事實(shí):從任意節(jié)點(diǎn)A到任意節(jié)點(diǎn)B的最短路徑不外乎2種可能,1是直接從A到B,2是從A經(jīng)過(guò)若干個(gè)節(jié)點(diǎn)到B。
(1) 迪杰斯特拉(Dijkstra)算法按路徑長(zhǎng)度(看下面表格的最后一行,就是next點(diǎn))遞增次序產(chǎn)生最短路徑。先把V分成兩組:
S:已求出最短路徑的頂點(diǎn)的集合
V-S=T:尚未確定最短路徑的頂點(diǎn)集合
將T中頂點(diǎn)按最短路徑遞增的次序加入到S中,依據(jù):可以證明V0到T中頂點(diǎn)Vk的最短路徑,或是從V0到Vk的直接路徑的權(quán)值或是從V0經(jīng)S中頂點(diǎn)到Vk的路徑權(quán)值之和(反證法可證,說(shuō)實(shí)話,真不明白哦)。
(2) 求最短路徑步驟
初使時(shí)令 S={V0},T={其余頂點(diǎn)},T中頂點(diǎn)對(duì)應(yīng)的距離值, 若存在<V0,Vi>,為<V0,Vi>弧上的權(quán)值(和SPFA初始化方式不同),若不存在<V0,Vi>,為Inf。
從T中選取一個(gè)其距離值為最小的頂點(diǎn)W(貪心體現(xiàn)在此處),加入S(注意不是直接從S集合中選取,理解這個(gè)對(duì)于理解vis數(shù)組的作用至關(guān)重要),對(duì)T中頂點(diǎn)的距離值進(jìn)行修改:若加進(jìn)W作中間頂點(diǎn),從V0到Vi的距離值比不加W的路徑要短,則修改此距離值(上面兩個(gè)并列for循環(huán),使用最小點(diǎn)更新)。
重復(fù)上述步驟,直到S中包含所有頂點(diǎn),即S=V為止(說(shuō)明最外層是除起點(diǎn)外的遍歷)。
二、最短路徑求最值12個(gè)模型詳解
最短路徑求最值12個(gè)模型詳解見下:
問(wèn)題一:在直線 l 上求一點(diǎn) P,使得 PA + PB 值最小 .
作法:連接 AB,與直線 l 的交點(diǎn)即為 P 點(diǎn) .
原理:兩點(diǎn)之間線段最短 . PA + PB 最小值為 AB .
問(wèn)題二:(“將軍飲馬問(wèn)題”)在直線 l 上求一點(diǎn) P,使得 PA + PB 值最小 .
作法:作點(diǎn) B 關(guān)于直線 l 的對(duì)稱點(diǎn) B',連接 AB' 與 l 的交點(diǎn)即為點(diǎn) P.
原理:兩點(diǎn)之間線段最短. PA + PB 最小值為 AB' .
問(wèn)題三:在直線 l1、l2 上分別求點(diǎn) M、N,使得 △PMN 的周長(zhǎng)最小.
作法:分別作點(diǎn) P 關(guān)于兩條直線的對(duì)稱點(diǎn) P' 和 P'',連接 P'P'',與兩條直線的交點(diǎn)即為點(diǎn) M,N.
原理:兩點(diǎn)之間線段最短. PM + MN + PN 的最小值為線段 P'P'' 的長(zhǎng).
問(wèn)題四:在直線 l1、l2 上分別求點(diǎn) M、N,使四邊形 PQMN 的周長(zhǎng)最?。?/p>
作法:分別作點(diǎn) Q 、P 關(guān)于直線 l1、l2 的對(duì)稱點(diǎn) Q' 和 P' 連接 Q'P',與兩直線交點(diǎn)即為點(diǎn) M,N.
原理:兩點(diǎn)之間線段最短. 四邊形 PQMN 周長(zhǎng)的最小值為線段 Q'P' + PQ 的長(zhǎng).
問(wèn)題五:(“造橋選址問(wèn)題”)直線 m∥n,在 m、n 上分別求點(diǎn) M、N,使 MN⊥m,
且 AM + MN + BN 的值最?。?/p>
作法:將點(diǎn) A 向下平移 MN 的長(zhǎng)度單位得 A',連接 A'B,交 n 于點(diǎn) N,過(guò) N 作 NM⊥m 于 M .
原理:兩點(diǎn)之間線段最短 . AM + MN + BN 的最小值為 A'B + MN .
問(wèn)題六:在直線 l 上求兩點(diǎn) M , N (M 在左),使 MN = a , 并使 AM + MN + NB 的值最小 .
作法:將點(diǎn) A 向右平移 a 個(gè)長(zhǎng)度單位得 A',作 A' 關(guān)于直線 l 的對(duì)稱點(diǎn) A'',連接 A''B 交直線 l 于點(diǎn) N,
將 N 點(diǎn)向左平移 a 個(gè)單位得 M .
原理:兩點(diǎn)之間線段最短 . AM + MN + NB 的最小值為 A''B + MN .
問(wèn)題七:在 l1 上求點(diǎn) A,在 l2 上求點(diǎn) B,使 PA + AB 值最小 .
作法:作點(diǎn) P 關(guān)于 l1 的對(duì)稱點(diǎn) P',作 P'B⊥l2 于點(diǎn) B,交 l1 于點(diǎn) A .
原理:點(diǎn)到直線,垂線段的距離最短 . PA + AB 的最小值為線段 P'B 的長(zhǎng) .
問(wèn)題八:A 為 l1上一定點(diǎn),B 為 l2 上一定點(diǎn),在 l2 上求點(diǎn) M,在 l1上求點(diǎn) N,
使 AM + MN + NB 的值最小 .
作法:作點(diǎn) A 關(guān)于 l2 的對(duì)稱點(diǎn) A' , 點(diǎn) B 關(guān)于 l1 的對(duì)稱點(diǎn) B',連接 A'B' 交 l2 于點(diǎn) M,交 l1 于點(diǎn) N.
原理:兩點(diǎn)之間線段最短. AM + MN + NB 的最小值為線段 A'B' 的長(zhǎng).
問(wèn)題九:在直線 l 上求一點(diǎn) P,使 | PA - PB | 的值最?。?/p>
作法:連接 AB,作 AB 的中垂線與直線 l 的交點(diǎn)即為 P 點(diǎn).
原理:垂直平分上的點(diǎn)到線段兩端點(diǎn)的距離相等. | PA - PB | = 0 .
問(wèn)題十:在直線 l 上求一點(diǎn) P,使 | PA - PB | 的值最大.
作法:作直線 AB,與直線 l 的交點(diǎn)即為 P 點(diǎn).
原理:三角形任意兩邊之差小于第三邊. | PA - PB | ≤ AB , | PA - PB | 的最大值 = AB .
問(wèn)題十一:在直線 l 上求一點(diǎn) P,使 | PA - PB | 的值最大.
作法:作點(diǎn) B 關(guān)于直線 l 的對(duì)稱點(diǎn) B' 作直線 AB',與直線 l 的交點(diǎn)即為 P 點(diǎn).
原理:三角形任意兩邊之差小于第三邊. | PA - PB | ≤ AB' , | PA - PB | 的最大值 = AB' .
問(wèn)題十二:(“費(fèi)馬點(diǎn)”)△ABC 中每一內(nèi)角都小于 120°,在 △ABC 內(nèi)求一點(diǎn) P,
使得 PA + PB + PC 的值最小 .
作法:所求點(diǎn)為 “費(fèi)馬點(diǎn)” ,即滿足 ∠APB = ∠BPC = ∠APC = 120° .
以 AB 、 AC 為邊向外作等邊 △ABD、△ACE,連接 CD、BE 相交于點(diǎn) P,點(diǎn) P 即為所求 .
原理:兩點(diǎn)之間線段最短 . PA + PB + PC 的最小值 = CD .
三、數(shù)據(jù)結(jié)構(gòu)求最短路徑
用Dijkstra算法求從V1頂點(diǎn)到其他各頂點(diǎn)的最短距離和最短路徑的C語(yǔ)言程序如下
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 6 // 頂點(diǎn)數(shù)
#define INF 32767
int adj_arr[N][N] = {{INF, 2, 3, INF, INF, INF},
{INF, INF, INF, 5, INF, INF},
{INF, INF, INF, 3, 10, INF},
{INF, INF, INF, INF, INF, 4},
{INF, INF, INF, INF, INF, INF},
{INF, INF, INF, INF, 2, INF}}; // 用一個(gè)全局二維數(shù)組存儲(chǔ)帶權(quán)有向圖的鄰接矩陣
void shortest_path(int start, int end);
void print_shortest_path(int* distance,int* path,int* used,int start,int end);
int main(){
int i;
char s1[3];
for(i=1;i<6;i++){
shortest_path(0, i);
}
return 0;
}
void shortest_path(int start, int end){ // 基于Dijkstra算法的最短路徑函數(shù)
int distance[N]; // 用于存放起始點(diǎn)到其余各點(diǎn)的最短距離
int path[N]; // 用于存放起始點(diǎn)到其余各點(diǎn)最短路徑的前一個(gè)頂點(diǎn)
int used[N] = { 0 }; // 用于標(biāo)記該頂點(diǎn)是否已經(jīng)找到最短路徑
int i, j, min_node, min_dis, pass_flag = 0;
for(i = 0; i < N; i++){
distance[i] = adj_arr[start][i]; // 初始化距離數(shù)組
if(adj_arr[start][i] < INF){
path[i] = start; // 初始化路徑數(shù)組
}else{
path[i] = -1;
}
}
used[start] = 1;
path[start] = start;
for(i = 0; i < N; i++){
min_dis = INF;
for(j = 0; j < N; j++){
if(used[j] == 0 && distance[j] < min_dis){
min_node = j;
min_dis = distance[j];
pass_flag++; // 標(biāo)記是否存在通路
}
}
if(pass_flag != 0){
used[min_node] = 1;
for(j = 0; j < N; j++){
if(used[j] == 0){
if(adj_arr[min_node][j] < INF && distance[min_node] + adj_arr[min_node][j] < distance[j]){
distance[j] = distance[min_node] + adj_arr[min_node][j];
path[j] = min_node;
}
}
}
}else{
printf("沒有通路!n");
return;
}
}
print_shortest_path(distance, path, used, start, end);
return;
}
void print_shortest_path(int* distance,int* path,int* used,int start,int end){ // 輸出最短距離并打印最短路徑
int i = 0, pre, inverse_path[N];
char s1[3],s2[3];
sprintf(s1, "V%d", (start+1));
sprintf(s2, "V%d", (end+1));
printf("從%s頂點(diǎn)到%s頂點(diǎn)的最短距離: %dn", s1, s2, distance[end]);
inverse_path[i] = end;
pre = path[end];
if(pre == -1){
printf("沒有通路!n");
}else{
while(pre != start){
inverse_path[++i] = pre;
pre = path[pre];
}
inverse_path[++i] = start;
printf("從%s頂點(diǎn)到%s頂點(diǎn)的最短路徑:n", s1, s2);
for(; i > 0; i--){
sprintf(s1, "V%d", (inverse_path[i]+1));
printf("%s -> ", s1);
}
sprintf(s1, "V%d", (inverse_path[i]+1));
printf("%sn", s1);
}
return;
}
四、求出最短路徑,要過(guò)程,用Dijkstra算法。。。
從v1開始遍歷
v2 = 2;
v3 = 5;
v2較小所以跳到v2
v3 = 4;
v4 = 6;
v5 = 8;
v3較小所以跳到v3
v4 = 5;
v6 = 7;
v4較小所以跳到v4
v6 = 6;
v7 = 9;
v6較小所以跳到v6
v7 = 8;
所以最后結(jié)果v1 -> v7最短路徑為v1->v2->v3->v4->v6->v7,最短路徑長(zhǎng)度為8
以上就是關(guān)于如何求最短路徑相關(guān)問(wèn)題的回答。希望能幫到你,如有更多相關(guān)問(wèn)題,您也可以聯(lián)系我們的客服進(jìn)行咨詢,客服也會(huì)為您講解更多精彩的知識(shí)和內(nèi)容。
推薦閱讀:
公眾號(hào)是如何盈利的(公眾號(hào)是怎么盈利的)
抖音怎么找那些賣的(陌陌上說(shuō)的600一次敢約嗎)
問(wèn)大家
抖音如何開通韓國(guó)直播權(quán)限?抖音怎么開通韓國(guó)直播權(quán)限
大通熱門的宣傳片拍攝宣傳片剪輯價(jià)格行情如何?在座的大俠們幫忙回一下
抖音海外直播權(quán)限開通?在海外如何開通抖音直播權(quán)限?
壁紙行業(yè)設(shè)計(jì)師,裝飾渠道、電商渠道等各個(gè)渠道如何選擇?
蘇州書生商友信息科技有限公司在淮南網(wǎng)站建設(shè)設(shè)計(jì)行業(yè)名聲如何?諸位看官們有沒有誰(shuí)了解
東城奠基儀式辦公會(huì)議場(chǎng)地出租如何選擇不被騙?在座的老鐵們?cè)诰€等
寧波日?qǐng)?bào)登報(bào)電話多少如何登報(bào)辦理
抖音海外直播權(quán)限解決方法,抖音如何開通國(guó)外直播權(quán)限
湟源微電影活動(dòng)拍攝制作如何發(fā)現(xiàn)適合自己的?各位大佬們拜托了
如東誠(chéng)信的網(wǎng)站建設(shè)設(shè)計(jì)性價(jià)比怎么樣?在座的筒子們幫忙回一下