- 题目
08-图7 公路村村通 (30分)
- 分析
典型的最小生成树问题。
prim算法和dijkstra算法长得很像。prim算法核心思想就是让一棵小树长大,采用贪心策略,每次从小树相邻的顶点中收录一个路径最短的顶点,直到这棵树长到最大。最后检查这棵树中的顶点是否完全包含了图中的顶点,如果没有,就说明图不连通,不存在最小生成树。
![prim算法](https://img-blog.csdn.net/20170531105223156?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYm9ibzEzNTY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
- prim算法求解代码
#include <stdio.h>
#define MAXN 1001
#define INF 1234567
int graph[MAXN][MAXN];
int dist[MAXN];
int collected[MAXN] = {
0};
int minCost = 0;
void prim(const int N){
collected[1] = 1;
int minPos, minDist;
while (1) {
minPos = -1, minDist = INF;
for(int i=1; i<=N; i++){
if(collected[i]==0 && dist[i]<minDist){
minPos = i;
minDist = dist[i];
}
}
if(minPos == -1) break;
collected[minPos] = 1;
minCost += dist[minPos];
for(int i=1; i<=N; i++){
if(collected[i]==