Prim算法是有关图的最小生成树的算法。1957年由美国计算机科学家罗伯特·普里姆(Robert C. Prim)独立发现。
百度百科:Prim算法。
维基百科:Prim's Algorithm。
程序说明:图存储在二维数组中,即邻接矩阵中。使用s集合和vs集合辅助Prim算法的过程,开始时将指定的开始结点放入s集合中,其他剩余的结点放入vs集合中,从s集合到vs集合的边中找出一个代价最小的边,然后将相关的结点从vs集合取出放入s集合,指定所有结点都在s集合为止。
需要说明的是,该程序使用了三重循环,其计算速度相当的慢,可以说是不可用的。
C语言程序:
/* Prim算法的C语言程序 */ #include <stdio.h> #define MAX_INT (int)((unsigned)(-1) >> 1) #define MIN(x, y) ((x)>(y))?(y):(x) #define TRUE 1 #define FALSE 0 #define N 6 struct item { int s; int v; int cost; } closedge[N]; int pc = 0; int a[N+1][N+1]; int s_set[N+1], s_count; int vs_set[N+1], vs_count; void createMatrix(); void init(int s); void prim(); int main(void) { int i, j, s; createMatrix(); for(i=1; i<=N; i++) { for(j=1; j<=N; j++) printf("%4d", a[i][j]); printf(" "); } printf("start node:"); scanf("%d", &s); if(s>=1 && s<=N) { init(s); } else { printf("input error! "); return -1; } prim(); printf("result: "); for(i=0; i<pc; i++) { printf("%4d%4d %4d ", closedge[i].s, closedge[i].v, closedge[i].cost); } return 0; } void prim() { int i, j, minval, pi, pj; for(;;) { if(vs_count == 0) return; minval=MAX_INT; for(i=1; i<=N; i++) { if(s_set[i]) { for(j=1; j<=N; j++) { if(i!=j && vs_set[j]) { if(a[i][j] != -1 && a[i][j] < minval) { minval = a[i][j]; pi = i; pj = j; } } } } } s_set[pj] = TRUE; s_count++; vs_set[pj] = FALSE; vs_count--; closedge[pc].s = pi; closedge[pc].v = pj; closedge[pc].cost = minval; pc++; } } //创建邻接矩阵 void createMatrix() { int i, j; for(i=1; i<=N; i++) for(j=1; j<=N; j++) if(i==j) a[i][j] = 0; else a[i][j] = -1; FILE *fp; fp = fopen("/home/lin/workdir/TYUT/algorithm/p1.txt", "r"); for(;;) { int val; fscanf(fp, "%d%d%d", &i, &j, &val); if(i == -1) break; a[i][j] = val; a[j][i] = val; } fclose(fp); } void init(int s) { int i; for(i=1; i<=N; i++) { s_set[i] = FALSE; vs_set[i] = TRUE; } s_set[s] = TRUE; s_count = 1; vs_set[s] = FALSE; vs_count = N-1; }
输入文件数据:
1 2 6 1 3 1 1 4 5 2 3 5 2 5 3 3 4 5 3 5 6 3 6 4 4 6 2 5 6 6 -1 -1 -1
程序运行结果:
0 6 1 5 -1 -1 6 0 5 -1 3 -1 1 5 0 5 6 4 5 -1 5 0 -1 2 -1 3 6 -1 0 6 -1 -1 4 2 6 0 start node:1 result: 1 3 1 3 6 4 6 4 2 3 2 5 2 5 3
输入的图:
输出的图: