Prime算法

graph.h

#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
 
#define  MAXVEX   100  /**< 最多顶点数 */
#define  INFINITY    65535/**< 不存在该边是的权值 */
 
struct  graph;
typedef  struct  graph  *Graph;
typedef  int  VertexType;
typedef  int     EdgeType;
 
struct   graph
{
    VertexType   vertex[MAXVEX];
    EdgeType   edge[MAXVEX][MAXVEX];
    int   numvertex,numedge;
};
 
void  CreatGraph(Graph  G);/**< 创建图 */
void  PrintGraph(Graph  G);/**<  将图以邻接矩阵的形式打印出来*/
void  Prime(Graph  G);/**< 最小生成树算法 */
 
#endif // GRAPH_H_INCLUDED

graph.c

#include  <stdio.h>
#include  "graph.h"
 
/**
 *作者:孤月天心 2013年10月
* any question related to me.
 */
void  CreatGraph(Graph  G)
{
    int  i,j,k,w;
 
    printf("input  the  number  of vertex ang  edge:\n");
    printf("the number of  vertex :");
    scanf("%d",&G->numvertex);
    printf("\n");
    printf("the number of edge:");
    scanf("%d",&G->numedge);
 
    /**< 输入顶点 */
    for(i=0;i<G->numvertex;i++)
    {
           scanf("%d",&G->vertex[i]);
    }
 
 
    /**< 矩阵初始化 */
    for(i=0;i<G->numvertex;i++)
    {
        for(j=0;j<G->numedge;j++)
        {
            G->edge[i][j] = INFINITY;
        }
    }
 
    /**< 输入边的权值此处一边控制循环次数 */
    for(k=0;k<G->numedge;k++)
    {
        printf("input     vertex  and weight:\n");
        scanf("%d %d %d",&i,&j,&w);
        G->edge[i][j] = w;
        G->edge[j][i] =G->edge[i][j];
 
    }
}
 
void  PrintGraph(Graph  G)
{
    int  i,j;
 
    for(i=0;i<G->numvertex;i++)
    {
        for(j=0;j<G->numvertex;j++)
        {
            if(G->edge[i][j] == INFINITY)
                printf("\t**");
            else
                printf("\t%d",G->edge[i][j]);
        }
        printf("\n");
    }
}
 
 
void  Prime(Graph  G)
{
      int  min,i,j,k;
 
      int  adjvertex[MAXVEX];/**< 邻接点数组 */
      int  lowcost[MAXVEX];/**< 值为零表示该点已加入最小生成树 */
 
      lowcost[0] = 0;
      adjvertex[0] = 0;
 
      /**< 初始化辅助数组初始化为第一行数据 */
      for(i=1;i<G->numvertex;i++)
      {
          lowcost[i] = G->edge[0][i];
          adjvertex[i] = 0;
      }
 
      /**< 主循环,不断更换两个数组的值直到lowcost全为零 */
      for(i=1;i<G->numvertex;i++)
      {
          min = INFINITY;
 
          j=1;
          k=0;
      /**< 循环全部顶点 */
          while(j<G->numvertex)
          {
              if(lowcost[j] != 0  && lowcost[j] < min)
              {
                  min=lowcost[j];          /**< 求出当前最小权值存入K中 */
                  k=j;
              }
              j++;
          }
 
          printf("(%d,%d)",adjvertex[k],k);    /**< 打印边 */
 
          lowcost[k] = 0;             /**< 表示k已加入生成树 */
 
 
          /**< 更新adjvertex数组数据,查找所有与K相邻点的最小权值(即邻接矩阵第k行数据) */
          for(j=1;j<G->numvertex;j++)
          {
              if(lowcost[j] != 0 &&  G->edge[k][j] < lowcost[j])
              {
                  lowcost[j] = G->edge[k][j];         /**< 将较小权值存入lowcost */
                  adjvertex[j] =k;             /**< 将k存入邻接数组以备下次循环比较用 */
              }
          }
      }
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include  <malloc.h>
#include  "graph.c"
 
int main()
{
    Graph  G;
    G=(Graph)malloc(sizeof(struct graph));
 
    CreatGraph(G);
    PrintGraph(G);
    Prime(G);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值