對於網圖來說,最短路徑是指兩頂點之間經過的邊上權值之和最少的路徑,並且我們稱路徑上的第一個頂點是源點,最後一個頂點是終點。
迪傑斯特拉算法:
解決了從某個源點到其餘各頂點的最短路徑問題。此算法的時間複雜度是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");
}