先介紹floyd演算法,這種演算法可以用來求圖中任意兩點間的最短路
思路:下面是整個程式的**
//floyd
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 1000 + 10;
const
int inf = 0x3f3f3f3f;
int d[maxn][maxn];
int n, m;
int main()
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(d[i][k] < inf && d[k][j] < inf)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
for(int i = 1; i <= n; i++)
return
0;}
思路:
如果我們要求包含點i, j的最小環,在已經算出來i, j之間的最短路d[i][j]的情況下(假設他們之間是經過點k中轉的),還需要計算有j到i且不經過點k的最短路
我們令k為這個最小環裡的最大編號的點,則在前面計算d[i][j]時,一定沒有經過點k,所以當第一層迴圈迴圈到k時,列舉所有小於k的點對,計算d[i][j] + m[j][k] + m[k][i],更新最小環的值
*把上面的程式放在正常求floyd時遍歷i,j迴圈的前面*
//floyd求最小環
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 1000 + 10;
const
int inf = 0x3f3f3f3f;
int d[maxn][maxn];
intmap[maxn][maxn]; //兩點之間的距離,這個陣列是固定的,不會更新
int n, m;
int main()
int ans = inf;
for(int k = 1; k <= n; k++)
// for(int i = 1; i <= n; i++)
//
cout
<< ans;
return
0;}
最短路徑(Dijkstra和Floyd)
floyd演算法 有點類似dp的思想 floyd 弗洛伊德 演算法的基本思想是 對乙個頂點個數為n的有向網 或無向網 設定乙個n n的方陣a,其中除對角線的矩陣元素都等於外,其他元素a k i j i j 表示從頂點vi到頂點vj的有向路徑長度.時間複雜度為o n 3 int edge m m 鄰接...
最短路徑 Dijkstra演算法和Floyd演算法
dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...
最短路徑 Dijkstra演算法和Floyd演算法
dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...