最短路径:
最短路径是指两顶点之间经历的边数最少的路径,若边有权值,则指权值之和最小的路径。
Dijkstra(迪杰斯特拉)算法的基本思想:
每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图不能有负权边,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。
代码如下:
int Pathmatrix[MAXVEX];//用于存储最短路径下标的数组(前驱顶点的下标)
int ShortPathTable[MAXVEX];//用于存储到各点最短路径的权值和
void ShortestPath(MGraph G,int Vo,int Pathmatrix[],int ShortPathTable[])
{
int v,w,k,min;
int final[MAXVEX];//若final[w]为1,表示求得顶点Vo到Vw的最短路径
for (v = 0; v < G.vertexNum; v++)//初始化数据
{
final[v] = 0;
Pathmatrix[v] = 0;
ShortPathTable[v] = G.matrix[Vo][v];//将与Vo点有连线的顶点加上权值
}
ShortPathTable[Vo] = 0;//Vo至Vo的路径为0
final[Vo] = 1;
for (v = 1; v < G.vertexNum; v++)//每次循环求得Vo到某个顶点v的最短路径
{
min = INFINITE;//初始化min
for (w = 0; w < G.vertexNum; w++)//寻找离Vo最近的顶点
{
if (!final[w] && ShortPathTable[w] < min)
{
k = w;
min = ShortPathTable[w];//w顶点离Vo更近
}
}
final[k] = 1;//将目前找到的最近的顶点置为1
for (w = 0; w < G.vertexNum; w++)//更新当前最短路径及距离
{
//如果经过v顶点的路径比现在这条路径的长度短的话
if (!final[w] && (min + G.matrix[k][w]) < ShortPathTable[w])
{
ShortPathTable[w] = min + G.matrix[k][w];
Pathmatrix[w] = k;
}
}
}
}
Floyd(弗洛伊德)算法的基本思想:
从任意节点 A 到任意节点 B 的最短路径不外乎 2 种可能,1 是直接从 A 到 B,2 是从 A 经过若干个节点 X 到 B。所以,我们假设 ShortPathTable(AB) 为节点 A 到节点 B 的最短路径的距离,对于每一个节点 X ,我们检查ShortPathTable(AX) + ShortPathTable(XB) < ShortPathTable(AB) 是否成立,如果成立,证明从 A 到 X 再到 B 的路径比 A 直接到 B 的路径短,我们便设置 ShortPathTable(AB) = ShortPathTable(AX) + ShortPathTable(XB),这样一来,当我们遍历完所有节点 X,ShortPathTable(AB) 中记录的便是 A 到 B 的最短路径的距离。
代码如下:
int Pathmatrix[MAXVEX][MAXVEX];//用于存储最短路径下标的数组
int ShortPathTable[MAXVEX][MAXVEX];//用于存储到各点最短路径的权值和
void ShortestPath(MGraph G,int Pathmatrix[][MAXVEX],int ShortPathTable[][MAXVEX])
{
int v,w,k;
for (v = 0; v < G.vertexNum; v++)//初始化数据
{
for (w = 0; w < G.vertexNum; w++)//如果经过下标为k顶点路径比原来两点间路径更短
{
ShortPathTable[v][w] = G.matrix[v][w];
Pathmatrix[v][w] = w;
}
}
for (k = 0; k < G.vertexNum; k++)
{
for (v = 0; v < G.vertexNum; v++)
{
for (w = 0; w < G.vertexNum; w++)
{
if (ShortPathTable[v][w] > ShortPathTable[v][k] + ShortPathTable[k][w])
{
ShortPathTable[v][w] = ShortPathTable[v][k] + ShortPathTable[k][w];
Pathmatrix[v][w] = Pathmatrix[v][k];//路径设置经过下标为k的顶点
}
}
}
}
}