一、最小生成树(最小代价树)
-
Kruskal算法
二、最短路径
void BFS_MinDistance(Graph g, int u) {
for (int i = 0; i < g.vexNum; ++i) {
d[i] = ∞;
path[i] = -1;
}
d[u] = 0;
visited[u] = true;
Enqueue(Q, u);
while (!isEmpty(Q)) {
DeQueue(Q, u);
for (w = FirstNeighbor(g, u); w >= 0; w = NextNeighbor(g, u, w)) {
if (!visited[w]) {
d[w] = d[u] + 1;
path[w] = u;
visited[w] = true;
Enqueue(Q, w);
}
}
}
}
-
单源:Dijkstra算法(不适用负权图)
视频讲解
-
如何查看v1到v3的最短路径?
迪杰斯特拉算法是求单源最短路径的,上图是以v0为起点的单源路径,要求v1到v3得求以v1为单源的路径。
-
各顶点:Floyd算法(适用负权图,但不适用负权回路图)
Floyd讲解
- Floyd代码实现
int A[N][N];
int path[N][N];
void Floyd(int A[][N], int path[][N]) {
for (int k = 0; k < N; ++k) {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if (A[i][j] > A[i][k] + A[k][j]) {
A[i][j] = A[i][k] + A[k][j];
path[i][j] = k;
}
}
}
}
}
- 总结