引言最小生成树(Minimum Spanning Tree,MST)是图论中的一个重要概念,它广泛应用于网络设计、交通规划、资源分配等领域。Prim算法是求解最小生成树的一种有效方法,本文将深入解析C...
最小生成树(Minimum Spanning Tree,MST)是图论中的一个重要概念,它广泛应用于网络设计、交通规划、资源分配等领域。Prim算法是求解最小生成树的一种有效方法,本文将深入解析C语言中Prim算法的实现,从基础概念到实战应用,帮助读者解锁图论高效优化技巧。
最小生成树是指在一个连通无向图中,包含图中所有顶点且边的权值总和最小的生成树。
Prim算法是一种贪心算法,其基本思想是从图中某个顶点开始,逐步将其他顶点加入生成树中,直到所有顶点都被加入。
#include
#include
#define MAXV 1000
#define INF 1000000
int n; // 顶点数
int adj[MAXV][MAXV]; // 图的邻接矩阵
int dist[MAXV]; // 记录当前生成树中每个节点到树的距离
int visited[MAXV]; // 记录每个节点是否已经加入生成树中
// 优先队列(最小堆)
typedef struct { int vertex; // 顶点编号 int distance; // 距离
} HeapNode;
void swap(HeapNode *a, HeapNode *b) { HeapNode temp = *a; *a = *b; *b = temp;
}
void heapify(HeapNode heap[], int size, int i) { int smallest = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < size && heap[left].distance < heap[smallest].distance) smallest = left; if (right < size && heap[right].distance < heap[smallest].distance) smallest = right; if (smallest != i) { swap(&heap[i], &heap[smallest]); heapify(heap, size, smallest); }
}
void prim() { int numEdges = 0; // 边的数量 int totalWeight = 0; // 总权值 // 初始化优先队列 HeapNode heap[MAXV]; int heapSize = 0; // 将起始顶点加入优先队列 heap[heapSize++] = (HeapNode){0, 0}; // 循环直到所有顶点都被加入生成树 while (heapSize > 0) { // 取出距离生成树最近的顶点 HeapNode u = heap[0]; for (int i = 1; i < heapSize; i++) { if (heap[i].distance < u.distance) { u = heap[i]; } } heapify(heap, heapSize, 0); // 将顶点u加入生成树 visited[u.vertex] = 1; totalWeight += u.distance; // 更新邻接顶点的距离 for (int v = 0; v < n; v++) { if (adj[u.vertex][v] && !visited[v]) { if (dist[v] > adj[u.vertex][v]) { dist[v] = adj[u.vertex][v]; heap[heapSize++] = (HeapNode){v, dist[v]}; } } } // 移除已加入生成树的顶点 while (heapSize > 0 && visited[heap[0].vertex]) { heapify(heap, heapSize, 0); heapSize--; } } // 输出生成树 printf("Total weight: %d\n", totalWeight); for (int i = 1; i < n; i++) { printf("Edge: (%d, %d) Weight: %d\n", u.vertex, i, adj[u.vertex][i]); }
}
int main() { // 初始化图 n = 5; adj[0][1] = 2, adj[1][0] = 2; adj[0][2] = 3, adj[2][0] = 3; adj[1][2] = 1, adj[2][1] = 1; adj[1][3] = 1, adj[3][1] = 1; adj[2][3] = 2, adj[3][2] = 2; adj[3][4] = 3, adj[4][3] = 3; // 计算最小生成树 prim(); return 0;
} 本文详细解析了C语言中Prim算法的实现,从基础概念到实战应用,帮助读者掌握图论高效优化技巧。在实际应用中,读者可以根据具体问题选择合适的算法和数据结构,提高算法效率和系统性能。