zoukankan      html  css  js  c++  java
  • Prim求解最小生成树

     1 #include "ljjz.h"
     2 
     3 typedef struct edgedata  /*用于保存最小生成树的边类型定义*/
     4        { int beg,en;     /*beg,en是边顶点序号*/
     5          int length;     /*边长*/
     6        }edge;
     7 
     8 /*函数功能:prim算法构造最小生成树
     9 函数参数:图的邻接矩阵g;边向量edge
    10 */
    11 void prim(Mgraph g, edge tree[M-1])
    12 {  edge x;
    13    int d,min,j,k,s,v;
    14 
    15    /* 建立初始入选点,并初始化生成树边集tree*/
    16    for(v=1;v<=g.n-1;v++)
    17    {
    18        tree[v-1].beg=0;
    19        tree[v-1].en=v;
    20        tree[v-1].length=g.edges[0][v];
    21    }
    22 
    23    /*依次求当前(第k条)最小两栖边,并加入TE*/
    24    for(k=0;k<=g.n-3;k++)
    25    {
    26        min=tree[k].length;
    27        s=k;
    28        for(j=k+1;j<=g.n-2;j++)
    29            if(tree[j].length<min)
    30            {
    31                min=tree[j].length;
    32                s=j;
    33            }
    34        v=tree[s].en;
    35        x=tree[s];
    36        tree[s]=tree[k];
    37        tree[k]=x;
    38 
    39    /*由于新顶点v的加入,修改两栖边的基本信息*/
    40        for(j=k+1;j<=g.n-2;j++)
    41        {
    42            d=g.edges[v][tree[j].en];
    43            if(d<tree[j].length)
    44            {
    45                tree[j].length=d;
    46                tree[j].beg=v;
    47            }
    48        }
    49    }
    50    /*输出最小生成树*/
    51     printf("
    最小生成树是:
    ");/*输出最小生成树*/
    52     for (j=0;j<=g.n-2;j++)
    53         printf("
    %c---%c  %d
    ",g.vexs[tree[j].beg],g.vexs[tree[j].en],tree[j].length);
    54     printf("
    最小生成树的根是: %c
    ", g.vexs[0]);
    55  }
    56 
    57 int  main()
    58   {
    59    Mgraph g;
    60    edge  tree[M-1];  /*用于存放最小生成树的M-1条边*/
    61    creat(&g,"g.txt",0);  /*创建无向图的邻接矩阵*/
    62    prim(g,tree);        /*求解图的最小生成树*/
    63    return 0;
    64 
    65   }
     1 /********************************************/
     2 /*         邻接矩阵类型定义的头文件             */
     3 /*               文件名:ljjz.h                   */
     4 /********************************************/
     5 
     6 #include <stdio.h>
     7 #define FINITY 5000               /*此处用5000代表无穷大*/
     8 #define M 20                          /*最大顶点数*/
     9 typedef char vertextype;          /*顶点值类型*/
    10 typedef int edgetype;             /*权值类型*/
    11 typedef struct{
    12     vertextype vexs[M];            /*顶点信息域*/
    13     edgetype edges[M][M];     /*邻接矩阵*/
    14     int n,e;                              /*图中顶点总数与边数*/
    15 } Mgraph;                               /*邻接矩阵表示的图类型*/
    16 /*   函数功能:建立图的邻接矩阵存储结构
    17      函数参数:邻接矩阵的指针变量g;存放图信息的文件名s;图的类型c,c=0表示建立无向图,否则表示建立有向图 
    18    函数返回值:无
    19 */ 
    20 void creat(Mgraph *g,char *s ,int c)
    21 {int i,j,k,w;           /*建立网络的邻接矩阵存储结构*/
    22    FILE *rf ;
    23    rf = fopen(s, "r") ;   /*从文件中读取图的边信息*/
    24    if (rf)
    25    {
    26    fscanf(rf,"%d%d",&g->n,&g->e);  /*读入图的顶点数与边数*/
    27    for(i=0;i<g->n;i++)    /*读入图中的顶点值*/
    28       fscanf(rf,"%1s",&g->vexs[i]);
    29  
    30    for(i=0;i<g->n;i++)    /*初始化邻接矩阵*/
    31       for(j=0;j<g->n;j++)
    32        if (i==j) g->edges[i][j]=0;
    33        else g->edges[i][j]=FINITY;
    34 
    35    for (k=0;k<g->e;k++)  /*读入网络中的边*/
    36     {fscanf(rf,"%d%d%d", &i,&j,&w);
    37      g->edges[i][j]=w;
    38      if (c==0) g->edges[j][i]=w;   /*如果C==0则建立无向图邻接矩阵,否则建立有向图邻矩阵*/
    39     }
    40    fclose(rf);
    41    }
    42    else g->n=0;
    43 }
    44 
    45 
    46 void  print(Mgraph g)
    47 {/*辅助函数,输出邻接矩阵表示的图g*/
    48   int i,j;
    49  
    50   for (i=0;i<g.n;i++)
    51    { printf("%c ",g.vexs[i]); 
    52     }
    53     printf("
    ");
    54   for (i=0;i<g.n;i++)
    55     {    for (j=0;j<g.n;j++)
    56          {printf("%6d",g.edges[i][j]);
    57         }
    58           printf("
    ");
    59        }
    60   }
  • 相关阅读:
    代码对比软件——code compare
    IAR调试和keil调试的一点小区别
    谷访问歌助手
    X86架构的寄存器
    ant-design-pro
    js 闭包 作用域
    《三体》总结
    如何通过SQL注入盗取数据库信息
    《看见》总结
    《欲望的演化》总结
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/6125552.html
Copyright © 2011-2022 走看看