HOME 首頁(yè)
SERVICE 服務(wù)產(chǎn)品
XINMEITI 新媒體代運(yùn)營(yíng)
CASE 服務(wù)案例
NEWS 熱點(diǎn)資訊
ABOUT 關(guān)于我們
CONTACT 聯(lián)系我們
創(chuàng)意嶺
讓品牌有溫度、有情感
專注品牌策劃15年

    如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))

    發(fā)布時(shí)間:2023-04-14 09:14:17     稿源: 創(chuàng)意嶺    閱讀: 50        

    大家好!今天讓創(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

    本文目錄:

    如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))

    一、求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.

    如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))

    原理:兩點(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;

    }

    如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))

    如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))

    如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))

    如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))

    如何求最短路徑(如何求最短路徑數(shù)據(jù)結(jié)構(gòu))

    四、求出最短路徑,要過(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)容。


    推薦閱讀:

    企業(yè)如何做廣告(企業(yè)如何做廣告策劃)

    怎么被傳媒公司簽約(如何被傳媒公司簽約)

    公眾號(hào)是如何盈利的(公眾號(hào)是怎么盈利的)

    杭州排屋戶型(杭州排屋戶型圖片)

    抖音怎么找那些賣的(陌陌上說(shuō)的600一次敢約嗎)