• prim算法


    算法部分

    typedef struct edgedata//最小生成树的边信息
    {
        int begin,end;//边起点,终点,长度
        int length;
    }edge;
    void prim(Mgraph g,edge tree[M-1])
    {
        edge temp;
        int d,minpos,j,k,min,v,i;
        //从第一个节点开始,所有两栖路径以第一个点为起点,长度为该两点长度
        for(i=1;i<=g.n-1;i++)
        {
            tree[i-1].begin=0;
            tree[i-1].end=i;
            tree[i-1].length=g.edges[0][i];
        }
        for(k=0;k<=g.n-3;k++)//选取第k条两栖路径
        {
            //找到未选择两栖路径中的最短路径并记录位置
            min=tree[k].length;
            minpos=k;
            for(j=k+1;j<=g.n-2;j++)
                if(tree[j].length<min)
            {
                min=tree[j].length;
                minpos=j;
            }
            v=tree[minpos].end;//记录当前最短路径的终点
            temp=tree[minpos];tree[minpos]=tree[k];tree[k]=temp;
            //通过交换,把当前最短路径换到已选择路径区域
    
            //在未选择的路径中分为:该点加入前与该区域的两栖路径,加入该点后其他未选择点与该点
            //的两栖路径,比较两个部分的路径,更新当前两栖路径
            for(j=k+1;j<=g.n-2;j++)
            {
                d=g.edges[v][tree[j].end];
    
                if(d<tree[j].length)
                {
                    tree[j].length=d;
                    tree[j].begin=v;
                }
            }
        }
        printf("
    The minimu cost spanning tree is:
    ");
        for(j=0;j<=g.n-2;j++)
            printf("%c---%c %d
    ",g.vexs[tree[j].begin],g.vexs[tree[j].end],tree[j].length);
        printf("the root of it is :%c
    ",g.vexs[0]);
    }

    邻接矩阵实现

    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    #define FINITY 50000
    #define M 20
    typedef char vertextype;
    typedef int edgetype;
    typedef struct
    {
        vertextype vexs[M];//定点信息
        edgetype edges[M][M];//邻接矩阵
        int n,e;//顶点总数,边总数
    }Mgraph;
    void creat(Mgraph *g,char *s,int c)
    {
        int i,j,k,w;
        FILE *rf;//从文件输入图数据
        rf=fopen(s,"r");
        if(rf)
        {
            fscanf(rf,"%d%d",&g->n,&g->e);//读入顶点数,边数
            for(i=0;i                                                                                                                                              <g ->n;i++)
                fscanf(rf,"%1s",&g->vexs[i]);//读入顶点值
            for(i=0;i<g->n;i++)//初始化邻接矩阵
                for(j=0;j<<g->n;j++)//注意:HTML上显示不出 实则为这条代码 for(j=0;j<g->n;j++)
                if(i==j)
                g->edges[i][j]=0;
                else g->edges[i][j]=FINITY;
            for(k=0;k<g->e;k++)//读入边
            {
    
                fscanf(rf,"%d%d%d",&i,&j,&w);
                printf("%d %d %d
    ",i,j,w);
                g->edges[i][j]=w;
                if(c==0)//如果是无向图则对应j,i相等
                    g->edges[j][i]=w;
            }
            fclose(rf);
        }
        else g->n=0;
    }



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Tjoi 2017 异或和
    Noi 十连测 建造记者站
    Noi 十连测 基因改造计划
    Noi 十连测 人生的经验
    NOI 十连测 Round 5 T2 运河计划
    NOI 十连测 Round 5 T1
    【ZJOI2018】迷宫
    BZOJ 十连测 day5 T3
    BZOJ 十连测 可持久化字符串
    BZOJ 十连测 二进制的世界
  • 原文地址:https://www.cnblogs.com/Thereisnospon/p/4768509.html
Copyright © 2020-2023  润新知