无论是在有向图还是无向图中,寻找两个点的最短路径,会用到floyd算法。通俗一点,floyd算法关键是找中间者来传递,例如matric[0][2]>matric[0][1]+matric[1][2],算0到2的最短路径就经过了1,1就是中间者。如果有N个数,则会更新N次。
此时,点a 为0,点b为1,点c为2。
#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define Max 100
#define inf 0x3f3f3f3f //int类型的无穷大表示
using namespace std;
class Solution
{
private:
int vexnum; //顶点数
int edgenum; //边数
int matric[Max][Max]; //邻接矩阵
public:
Solution(int v, int e) {
vexnum = v;
edgenum = e;
for(int i=0;i<v;i++)
for (int j = 0; j < v; j++)
{
if (i == j)
matric[i][j] = 0;
else
matric[i][j] = inf;
}
}
void Assignment(); //为邻接矩阵赋值,大小为边的权值
void Floyd(); //计算两点间最小路径长度
void Print(); //打印最后两点间的最短路径
};
void Solution::Floyd() //计算两点间最小路径长度
{
int i = 0, j = 0, k = 0;
for(i=0;i<vexnum;i++)
for (j = 0; j < vexnum; j++)
{
for (k = 0; k < vexnum; k++)
{
if (matric[j][k] > matric[j][i] + matric[i][k])
matric[j][k] = matric[j][i] + matric[i][k];
}
}
}
void Solution::Assignment()
{
cout << "请输入图中有向边的起点、终点和权值" << endl;
int start, end, weight;
int i, j;
for (i = 0; i < edgenum; i++)
{
cin >> start >> end >> weight;
matric[start][end] = weight;
}
}
void Solution::Print()
{
for (int i = 0; i < vexnum; i++)
{
for (int j = 0; j < vexnum; j++)
{
printf("%2d ",matric[i][j]);
}
cout << endl;
}
}
int main()
{
int v, e;
cout << "请输入顶点数,边数" << endl;
cin >> v >> e;
Solution s(v, e);
s.Assignment();
s.Floyd();
s.Print();
system("pause");
}
运行结果如下所示: