最短路径(Floyd算法)(c/c++)
生活随笔
收集整理的這篇文章主要介紹了
最短路径(Floyd算法)(c/c++)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如果要得到圖中各個(gè)頂點(diǎn)之間的最短路徑,方法1:可以對(duì)每一個(gè)頂點(diǎn)采用Dijkstra算法;方法2:可以采用Floyd算法,它是一種用來(lái)求雙源點(diǎn)之間最短路徑的算法,采用鄰接矩陣來(lái)存儲(chǔ)圖
輔助結(jié)構(gòu)
int D[maxSize][maxSize];//表示從各個(gè)頂點(diǎn)之間最短路徑長(zhǎng)度例:D[i][j]:表示從i頂點(diǎn)到j(luò)頂點(diǎn)的最短路徑長(zhǎng)度
bool p[maxSize][maxSize][maxSize];//表示最短路徑上的結(jié)點(diǎn) p[i][j][u] = true;//u頂點(diǎn)存在于從i到j(luò)最短路徑上簡(jiǎn)單示例
輸入為下圖:
| ∞ | 4 | 11 | ∞ | 4 | 11 | ∞ | 4 | 6 | ∞ | 4 | 6 | |
| D | 6 | ∞ | 2 | 6 | ∞ | 2 | 6 | ∞ | 2 | 5 | ∞ | 2 |
| 3 | ∞ | ∞ | 3 | 7 | ∞ | 3 | 7 | ∞ | 3 | 7 | ∞ | |
| \ | AB | AC | \ | AB | AC | \ | AB | ABC | \ | AB | ABC | |
| p | BA | \ | BC | BA | \ | BC | BA | \ | BC | BCA | \ | BC |
| CA | CB | \ | CA | CAB | \ | CA | CAB | \ | CA | CAB | \ |
一:初始的D數(shù)組為各點(diǎn)之間的權(quán)值,p表示各點(diǎn)之間最短路徑所包含的結(jié)點(diǎn)
二:加入A點(diǎn)為各點(diǎn)之間的中轉(zhuǎn)點(diǎn),對(duì)兩個(gè)數(shù)組進(jìn)行更替,用黃色字體標(biāo)出
三:加入B點(diǎn)…
四:加入C點(diǎn)…
當(dāng)所有點(diǎn)都被做為過(guò)中轉(zhuǎn)點(diǎn),算法結(jié)束
Floyd算法
void floyd(mGraph& G) {int i, j, u;//初始化for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j){D[i][j] = G.arc[i][j];for (u = 0; u < G.vexnum; ++u)p[i][j][u] = false;if (D[i][j] < infini)p[i][j][i] = p[i][j][j] = true;}//更新數(shù)組,存儲(chǔ)路徑for (u = 0; u < G.vexnum; ++u)for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j)if (i!=j&&D[i][u] + D[u][j] < D[i][j])//對(duì)每個(gè)結(jié)點(diǎn)對(duì)加入u結(jié)點(diǎn)進(jìn)行判斷{D[i][j] = D[i][u] + D[u][j];for (int v = 0; v < G.vexnum; ++v)p[i][j][v] = p[i][u][v] || p[u][j][v];} }完整示例
將上面的圖作為輸入:
#include<iostream> #define infini INT_MAX/3//最大值不選取INT_MAX,是防止溢出 #define maxSize 3//頂點(diǎn)數(shù)目 #define MAX 5//邊的個(gè)數(shù) //鄰接矩陣 typedef struct {int vexnum, arcnum;//頂點(diǎn)數(shù)和邊數(shù)char vex[maxSize];//頂點(diǎn)信息(字符)int arc[maxSize][maxSize];//二維數(shù)組(存儲(chǔ)邊上的信息) }mGraph;bool p[maxSize][maxSize][maxSize];//表示最短路徑上的結(jié)點(diǎn) int D[maxSize][maxSize];//表示從各個(gè)頂點(diǎn)之間最短路徑長(zhǎng)度void floyd(mGraph& G);//求最短路徑 int main() {using namespace std;mGraph G;//鄰接矩陣存儲(chǔ)圖并進(jìn)行初始化G.vexnum = maxSize;G.arcnum = MAX;char vexData[maxSize] = { 'a', 'b', 'c'};//頂點(diǎn)信息int arcData[MAX][3] = { { 0, 1 ,4}, { 0, 2,11 }, { 1, 0 ,6}, { 1, 2,2 }, { 2, 0 ,3} };//連接的邊int i, j;for (i = 0; i < G.vexnum; ++i){G.vex[i] = vexData[i];for (j = 0; j < G.vexnum; j++)G.arc[i][j] = infini;}for (i = 0; i < G.arcnum; i++)G.arc[arcData[i][0]][arcData[i][1]] = arcData[i][2];//初始化完畢cout << "求各點(diǎn)間最短路徑: ";cout << endl;floyd(G);int c;for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j){if (D[i][j] == infini){cout << "不存在" << vexData[i] << "到" << vexData[j]<< "的路徑" << endl;continue;}cout << vexData[i] << "到" << vexData[j]<< "的路徑長(zhǎng)度為:" << D[i][j] << " 包含頂點(diǎn):";for (c = 0; c < G.vexnum; ++c)if (p[i][j][c] == true)cout << vexData[c] << ' ';cout << endl;}cout << endl;return 0; } void floyd(mGraph& G) {int i, j, u;//初始化for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j){D[i][j] = G.arc[i][j];for (u = 0; u < G.vexnum; ++u)p[i][j][u] = false;if (D[i][j] < infini)p[i][j][i] = p[i][j][j] = true;}//更新數(shù)組,存儲(chǔ)路徑for (u = 0; u < G.vexnum; ++u)for (i = 0; i < G.vexnum; ++i)for (j = 0; j < G.vexnum; ++j)if (i!=j&&D[i][u] + D[u][j] < D[i][j])//對(duì)每個(gè)結(jié)點(diǎn)對(duì)加入u結(jié)點(diǎn)進(jìn)行判斷{D[i][j] = D[i][u] + D[u][j];for (int v = 0; v < G.vexnum; ++v)p[i][j][v] = p[i][u][v] || p[u][j][v];} }程序的輸出結(jié)果為:
Dijkstra算法求最短路徑:
https://blog.csdn.net/Little_ant_/article/details/104291049
(ps:希望大家可以多多點(diǎn)贊👍)
總結(jié)
以上是生活随笔為你收集整理的最短路径(Floyd算法)(c/c++)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 最短路径(Dijkstra算法)(c/c
- 下一篇: 顺序查找(c/c++)