对于网图来说,最短路径是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点是源点,最后一个顶点是终点。
迪杰斯特拉算法:
解决了从某个源点到其余各顶点的最短路径问题。此算法的时间复杂度是O(NxN)。
#define MAXVEX 9
#define INFINITY 65535
typedef int Patharc[MAXVEX];
typedef int ShortPathTable[MAXVEX];
void ShortestPath_Dijkstra(MGraph G, int v0, Patharc *P, ShortPathTable *D)
{
int v, w, k, min;
int final[MAXVEX];
for (v = 0; v < G.numVertexes; v++)
{
(*D)[v] = G.arc[v0][v];
(*P)[v] = 0;
final[v] = 0;
}
(*D)[v0] = 0;
final[v0] = 1;
for (v = 1; v < G.numVertexes; v++)
{
min = INFINITY;
for (w = 0; w < G.numVertexes; w++)
{
if (!final[w] && (*D)[w] < min)
{
min = (*D)[w];
k = w;
}
}
final[k] = 1;
for (w = 0; w < G.numVertexes; w++)
{
if (!final[w] && (min + G.arc[k][w] < (*D)[w]))
{
(*D)[w] = min + G.arc[k][w];
(*P)[w] = k;
}
}
}
}
弗洛伊德算法:
解决了从所以顶点到所有顶点的最短路径问题。此算法的时间复杂度是O(NxNxN)。
typedef int Pathmatrix[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];
void ShortestPath_Floyd(MGraph G, Pathmatrix *P, ShortPathTable *D)
{
int v, w, k;
for (v = 0; v < G.numVertexes; v++)
for (w = 0; w < G.numVertexes; w++)
{
(*D)[v][w] = G.matrix[v][w];
(*P)[v][w] = w;
}
for (k = 0; k < G.numVertexes; k++)
for (v = 0; v < G.numVertexes; v++)
for (w = 0; w < G.numVertexes; w++)
if ((*D)[v][k] + (*D)[k][w] < (*D)[v][w])
{
(*D)[v][w] = (*D)[v][k] + (*D)[k][w];
(*P)[v][w] = (*P)[v][k];
}
}
//打印无向网的所有顶点到所有顶点的最短路径
void PrintPath(MGraph G, Pathmatrix P, ShortPathTable D)
{
int v, w, k;
for (v = 0; v < G.numVertexes; v++)
for (w = v+1; w < G.numVertexes; w++)
{
printf("v%d-v%d weight: %d", v, w, D[v][w]);
k = (*P)[v][w];
printf(" path: %d", v);
while (k != w)
{
printf(" -> %d", k);
k = (*P)[v][w];
}
printf("\n");
}
printf("\n");
}