无向图的最小生成树算法的C程序实现代码(Prim算法)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//该结构体用来表示从某个顶点可以到达的其他顶点
struct ENode
{
    int secPoint;//顶点号
    int weight;
    ENode *next;//指向下一个顶点的指针
};


//该结构体表示每一个顶点的信息
struct PNode
{
    char value;//顶点的值
    ENode *next;//指向顶点可以到达的其他第一个顶点的指针
};


//图的结构体,该图最多有100个顶点
struct Map
{
    PNode point[100];//数组的下标就是这个顶点的顶点号
    int numPoint,numEdge;
};


//建图的函数
struct Map *CreateMap()
{
    struct Map *mp = (struct Map*)malloc(sizeof(struct Map));
    int i,j;
    int firP,secP,weight;
    int numP,numE;
    char infoP;

    memset(mp,0,sizeof(struct Map));

    printf("请输入顶点数和边数,格式为‘顶点数,边数’:\n");
    scanf("%d,%d",&numP,&numE);
    mp->numPoint = numP;
    mp->numEdge = numE;

    printf("请输入各个顶点的信息,没有分隔符的连续输入:\n");
    fflush(stdin);
    for(i=0;i<mp->numPoint;i++)
    {
        scanf("%c",&infoP);
        mp->point[i].value = infoP;
    }

    printf("请输入边和权重,格式为‘顶点-顶点,权重’\n");
    fflush(stdin);
    for(j=0;j<mp->numEdge;j++)
    {
        scanf("%d-%d,%d",&firP,&secP,&weight);
        struct ENode *newNode = (struct ENode *)malloc(sizeof(struct ENode));
        newNode->secPoint = secP;
        newNode->weight=weight;
        newNode->next = mp->point[firP].next;
        mp->point[firP].next = newNode;
    }
    return mp;
}


void Prim(struct Map *mp)
{
    int pointArray[20],i,j,min;
    int curPoint1,curPoint2;
    struct ENode *pNode;
    memset(pointArray,0,sizeof(pointArray));
    pointArray[0]=1;
    i=1;
    printf("\n\n最小生成树的各个边:\n");


//有顶点还未加入则循环

    while(i<mp->numPoint)
    {

        min=65537;

//循环遍历全图的各个顶点

        for(j=0;j<mp->numPoint;j++)
        {
            for(pNode=mp->point[j].next;pNode!=NULL;pNode=pNode->next)

            {

//一个顶点已经找出另一个顶点还未找出并且权值小于当前的最小值则记录下

                if(pointArray[j]==0 && pointArray[pNode->secPoint]==1 && pNode->weight < min)
                {
                    curPoint2=j;
                    curPoint1=pNode->secPoint;
                    min=pNode->weight;
                }
                else if(pointArray[j]==1 && pointArray[pNode->secPoint]==0 && pNode->weight < min)
                {
                    curPoint1=j;
                    curPoint2=pNode->secPoint;
                    min=pNode->weight;
                }
            }

        }

//一遍遍历之后curPoint2就是这次找出的顶点

        pointArray[curPoint2]=1;
        i++;
        printf("%d-%d\n",curPoint1,curPoint2);
    }
}
    
int main()
{
    struct Map *mp = CreateMap();
    Prim(mp);

    return 1;
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是用 C 语言建立有权无向图,并使用 Prim 算法构造最小生成树代码: ```c #include <stdio.h> #include <stdlib.h> #include <limits.h> #define MAX_VERTICES 100 #define INF INT_MAX int n; // 图的顶点数 int dist[MAX_VERTICES]; // 存放从已经包含在最小生成树中的顶点到其它顶点的最短距离 int visited[MAX_VERTICES]; // 标记顶点是否已经包含在最小生成树中 int graph[MAX_VERTICES][MAX_VERTICES]; // 存放图的邻接矩阵 void prim() { int i, j, k; int min; int u; // 初始化 for (i = 0; i < n; i++) { dist[i] = INF; visited[i] = 0; } dist[0] = 0; for (i = 0; i < n; i++) { min = INF; for (j = 0; j < n; j++) { if (!visited[j] && dist[j] < min) { min = dist[j]; u = j; } } visited[u] = 1; for (k = 0; k < n; k++) { if (!visited[k] && graph[u][k] < dist[k]) { dist[k] = graph[u][k]; } } } } int main() { int i, j; // 读入图的邻接矩阵 scanf("%d", &n); for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { scanf("%d", &graph[i][j]); } } prim(); // 输出最小生成树的边权和 int sum = 0; for (i = 0; i < n; i++) { sum += dist[i]; } printf("%d\n", sum); return 0; } ``` 在上述代码中,`graph` 数组存放有权无向图的邻接矩阵,`dist` 数组存放从已经包含在最小生成树中的顶点到其它顶点的最短距离,`visited` 数组标记顶点是否已经包含在最小生成树中。`prim()` 函数使用 Prim 算法构造最小生成树。在主函数中,我们首先读入图的邻接矩阵,然后调用 `prim()` 函数构造最小生成树,并输出最小生成树的边权和。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值