zoukankan      html  css  js  c++  java
  • 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

    输入的图:


    输出的图:


  • 相关阅读:
    hdu6007 Mr. Panda and Crystal 最短路+完全背包
    ID生成器的一种可扩展实现方案
    使用PUT方法上传文件无法工作原因分析
    负载均衡算法
    父类和子类属性覆盖的各种情况分析
    java functional syntax overview
    Starter Set of Functional Interfaces
    application/xml和text/xml的区别
    mime type 概要介绍
    spring mvc 详细执行流程
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564176.html
Copyright © 2011-2022 走看看