Prim算法的C语言程序

Prim算法是有关图的最小生成树的算法。1957年由美国计算机科学家罗伯特·普里姆(Robert C. Prim)独立发现

百度百科Prim算法

维基百科Prim's Algorithm

参考链接Prim算法的C语言程序

程序说明:图存储在二维数组中,即邻接矩阵中。使用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

输入的图:


输出的图:


原文地址:https://www.cnblogs.com/tigerisland/p/7564177.html