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("\n");
}
printf("start node:");
scanf("%d", &s);
if(s>=1 && s<=N) {
init(s);
} else {
printf("input error!\n");
return -1;
}
prim();
printf("result:\n");
for(i=0; i<pc; i++) {
printf("%4d%4d %4d\n", 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
输入的图:
输出的图: