【算法与数据结构】图的最小生成树 MST - Prim 算法

Prim 算法属于贪心算法。

#include <stdio.h>
#define VERTEXNUM 7
#define INF 10000

typedef struct Graph {
	int vertex[VERTEXNUM];
	int edge[VERTEXNUM][VERTEXNUM];
} Graph;

void initGraph(Graph* G) {
	int i, j;
	int init[][3] = {{1, 2, 10}, {1, 3, 8}, {1, 6, 20},
					{2, 3, 3}, {2, 5, 30}, {3, 4, 18},
					{3, 6, 7}, {4, 5, 2}, {6, 7, 1}};
	for (i = 0; i < VERTEXNUM; i++) {
		G->vertex[i] = 'a' + i;
		for (j = 0; j < VERTEXNUM; j++) {
			G->edge[i][j] = INF;
		}
	}
	for (i = 0; i < 9; i++) {
		G->edge[init[i][0] - 1][init[i][1] - 1] = init[i][2];
		G->edge[init[i][1] - 1][init[i][0] - 1] = init[i][2];
	}
}

void prim(Graph* G) {
	int parent[VERTEXNUM];
	int selected[VERTEXNUM];
	int nearest[VERTEXNUM];
	int i, j, k, lastVer, min;
	for (i = 0; i < VERTEXNUM; i++) {
		parent[i] = -1;
		selected[i] = 0;
		nearest[i] = INF;
	}
	lastVer = 0;
// 	selected[0] = 1;
	for (i = 0; i < VERTEXNUM; i++) {
		if (G->edge[0][i] < INF) {
			parent[i] = 0;
			nearest[i] = G->edge[0][i];
		}
	}
	for (i = 1; i < VERTEXNUM; i++) {
		min = INF;
		if (selected[lastVer] == 1)
			continue;
		selected[lastVer] = 1;
		for (j = 0; j < VERTEXNUM; j++) {
			if (G->edge[lastVer][j] < nearest[j]) {
				parent[j] = lastVer;
				nearest[j] = G->edge[lastVer][j];
			}
		}
		for (j = 0; j < VERTEXNUM; j++) {
			if (selected[j] != 1 && nearest[j] < min) {
				min = nearest[j];
				lastVer = j;
			}
		}
		printf("lastVer: %d\n", lastVer);
	}
}
int main () {
	Graph G;
	initGraph(&G);
	
	prim(&G);
	return 0;
}

posted on 2019-05-06 22:52  kikajack  阅读(305)  评论(0编辑  收藏  举报