Floyd算法(任意兩點(diǎn)間最短路徑)


因?yàn)闀r(shí)間復(fù)雜度為O(n^3),所以可以使用頂點(diǎn)數(shù)為200以內(nèi),創(chuàng)建鄰接矩陣在空間上也是可以的,而且每個(gè)點(diǎn)之間的數(shù)據(jù)都需要記錄,使用鄰接矩陣也是很好的。

設(shè)計(jì)思路:

  1. 遍歷所有的點(diǎn)k
  2. 以該點(diǎn)k為中介點(diǎn),遍歷所有與它相鄰的點(diǎn)是否滿足dis[i][k]+dis[k][j]<dis[i][j],滿足則覆蓋a[i][j]。
如果使用鄰接表,則dis[..][k]很難找,需要遍歷0-n-1的行才能找到所有的dis[..][k]。
dis[i][j]也是,操作比矩陣要復(fù)雜很多。

示例代碼:

測(cè)試數(shù)據(jù):
4 5
1 2 1
1 3 2
1 4 5
2 4 3
3 4 1
image.png

主要數(shù)據(jù)結(jié)構(gòu):

int dis[N][N]={0};           // 記錄到源點(diǎn)的距離
int points=0;                // 記錄點(diǎn)數(shù)

示例代碼:

#include <bits/stdc++.h>
using namespace std;
typedef struct{
  int num;      // 在BFS中第一列[0]中作為記錄上次遍歷的位置
  int length;    // 長(zhǎng)度
}Node;
const int INF=10000000;
#define N 200
int dis[N][N]={0};           // 記錄到源點(diǎn)的距離
int points=0;                // 記錄點(diǎn)數(shù)
int edges=0,begining,ending;
void Floyd(){
  int i,j,k;
  for(k=1;k<points+1;k++){
    for(i=1;i<points+1;i++){
      for(j=1;j<points;j++){
        if(dis[i][k]!=INF&&dis[k][j]!=INF&&dis[i][k]+dis[k][j]<dis[i][j]){
          // 如果同步到i>j的一面會(huì)導(dǎo)致實(shí)際更改未被打印,所以要把左側(cè)的結(jié)果同步到右側(cè)。
          dis[i][j]=dis[i][k]+dis[k][j];
          dis[j][i]=dis[i][k]+dis[k][j];
        }
      }
    }
  }
}
// 為了減少打印操作,只打印右半邊的數(shù)據(jù)
void show(){
  int i,j;
  for(i=1;i<points+1;i++){
    for(j=i+1;j<points+1;j++){
      if(dis[i][j]!=0)
      cout<<"("<<i<<","<<j<<")"<<dis[i][j]<<endl;
    }
  }
}
int main(){
  int i,j;
  scanf("%d %d",&points,&edges);
  for(i=1;i<points+1;i++){
    for(j=1;j<points+1;j++){
      dis[i][j]=INF;
    }
  }
  int point1,point2,length;
  for(i=0;i<edges;i++){
    scanf("%d %d %d",&point1,&point2,&length);
    dis[point1][point2]=length;
    dis[point2][point1]=length;
  }
  Floyd();
  show();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 圖的定義與術(shù)語(yǔ) 1、圖按照有無(wú)方向分為無(wú)向圖和有向圖。無(wú)向圖由頂點(diǎn)和邊構(gòu)成,有向圖由頂點(diǎn)和弧構(gòu)成?;∮谢∥埠突☆^之...
    unravelW閱讀 505評(píng)論 0 0
  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 6,008評(píng)論 0 19
  • 各校歷年復(fù)試機(jī)試試題 清華、北大、華科試題詳細(xì)筆記部分,少筆記部分與少數(shù)leetcode【含個(gè)人整理筆記】 一、詳...
    AIM外星人閱讀 1,340評(píng)論 0 1
  • 參見(jiàn)貪心算法——最短路徑Dijkstra算法參見(jiàn)動(dòng)態(tài)規(guī)劃 目錄 0.最短路徑問(wèn)題0.1 最短路徑問(wèn)題描述?0.1....
    王偵閱讀 5,164評(píng)論 1 9
  • 愛(ài)情對(duì)于每個(gè)人來(lái)說(shuō)都是神圣的,我們都不愿意將就,可最后卻要選擇將就,這或許是無(wú)奈的。 A君和華相識(shí)于網(wǎng)絡(luò),本來(lái)A君...
    小賴童鞋2012閱讀 611評(píng)論 3 2

友情鏈接更多精彩內(nèi)容