从零开始学数据结构系列之第四章《prim算法(普里姆算法)总代码程序进程讲解》


程序详细进程图

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

/**
 * 图顶点之前不通,那么邻接矩阵的值为MAX
 * 如果顶点是自己本身,那么值为0
 */
#define MAX 32767

typedef struct Graph {
    char* vexs;
    int** arcs;
    int vexNum;
    int arcNum;
}Graph;

typedef struct Edge {
    char vex;
    int weight;
}Edge;

/**
 * 当edge.weight = 0时,代表顶点加入到U集合中
 */ 
Edge* initEdeg(Graph* G, int index) 
{
	int i=0;
	Edge *T   =	(Edge*)malloc(sizeof(Edge) * G->vexNum);
	printf("initEdeg:\r\n");
	for(i=0;i<G->vexNum;i++)
	{
		T[i].vex = G->vexs[index];
		T[i].weight = G->arcs[index][i];
		printf("T[i].vex->%c, T[i].weight->%d\r\n", T[i].vex,T[i].weight);

	}
	printf("\r\n");
	return T;
}

int getMinEdge(Edge* edge, Graph* G)
{
	int min = MAX;
	int i=0;
	int index=0;
	printf("getMinEdge:\r\n");
	for(i=0;i<G->vexNum;i++)
	{
		if(edge[i].weight && edge[i].weight < min)
		{		
			min = edge[i].weight;
			index = i;
		}
	}
	printf("min:%d ,index:%d ",min,index);
	printf("\r\n");
	return index;
}

void prim(Graph* G, int index) 
{
	int i=0,j=0;
	Edge *edge = initEdeg(G,index);
	int min = 0;

	for(i=0;i<G->vexNum-1;i++)
	{
		printf("现在是第%d次循环:\r\n",i+1);
		min = getMinEdge(edge,G);
		
		printf("v%c --> v%c, weight = %d\n", edge[min].vex, G -> vexs[min], edge[min].weight);
		edge[min].weight = 0;
		for(j=0;j<G->vexNum;j++)
		{
			if(edge[j].weight > G->arcs[min][j] )
			{
				edge[j].weight = G->arcs[min][j];
				edge[j].vex = G->vexs[min];
				printf("edge[j].weight->%d      edge[j].vex->%c\n",edge[j].weight,edge[j].vex);
			}
		}
		printf("循环后的edge.weight的值为%d, %d, %d, %d, %d, %d :\r\n",edge[0].weight,edge[1].weight,edge[2].weight,edge[3].weight,edge[4].weight,edge[5].weight);
		printf("循环后的edge.vex的值为%c, %c, %c, %c, %c, %c :\r\n",edge[0].vex,edge[1].vex,edge[2].vex,edge[3].vex,edge[4].vex,edge[5].vex);
		printf("\r\n");
	printf("\r\n");
		
	}


} 

Graph* initGraph(int vexNum) 
{
	int i = 0;
    Graph* G = (Graph*)malloc(sizeof(Graph));
    G -> vexs = (char*)malloc(sizeof(char) * vexNum);
    G -> arcs = (int**)malloc(sizeof(int*) * vexNum);
    for (i = 0 ; i < vexNum; i++) {
        G -> arcs[i] = (int*)malloc(sizeof(int) * vexNum);
    }
    G -> vexNum = vexNum;
    G -> arcNum = 0;
    return G;
}

void createGraph(Graph* G, char* vexs, int* arcs) 
{
	int i=0,j=0;

    for (i = 0 ; i < G -> vexNum; i++) 
	{
        G -> vexs[i] = vexs[i];
        for (j = 0; j < G -> vexNum; j++) 
		{
            G -> arcs[i][j] = *(arcs + i * G -> vexNum + j);
            if (G -> arcs[i][j] != 0 && G -> arcs[i][j] != MAX)  
                G -> arcNum ++;
        }
    }
    G -> arcNum /= 2;
}

void DFS(Graph* G, int* visited, int index) 
{
	int i=0;
    printf("%c\t", G -> vexs[index]);
    visited[index] = 1;
    for (i = 0; i < G ->vexNum; i++) 
	{
        if (G -> arcs[index][i] > 0 && G -> arcs[index][i] != MAX && !visited[i]) 
		{
            DFS(G, visited, i);
        }
    }
}

int main() 
{
	int i=0;
	int arcs[6][6] = {
        0, 6, 1, 5, MAX, MAX,
        6, 0, 5, MAX, 3, MAX,
        1, 5, 0, 5, 6, 4,
        5, MAX, 5, 0, MAX, 2,
        MAX, 3, 6, MAX, 0, 6,
        MAX, MAX, 4, 2, 6, 0
    };
	Graph* G = initGraph(6);
	int* visited = (int*)malloc(sizeof(int) * G -> vexNum);
    
    
    for (i = 0; i < G -> vexNum; i++)
        visited[i] = 0;
    
    createGraph(G, "123456", (int*)arcs);
	printf("DSF:      ");
    DFS(G, visited, 0);
    printf("\n");
	printf("\n");
    prim(G, 0);
    return 0;
}

在这里插入图片描述
在这里插入图片描述

输出结果:

DSF:      1     2       3       4       6       5

initEdeg:
T[i].vex->1, T[i].weight->0
T[i].vex->1, T[i].weight->6
T[i].vex->1, T[i].weight->1
T[i].vex->1, T[i].weight->5
T[i].vex->1, T[i].weight->32767
T[i].vex->1, T[i].weight->32767

现在是第1次循环:
getMinEdge:
min:1 ,index:2
v1 --> v3, weight = 1
edge[j].weight->5      edge[j].vex->3
edge[j].weight->6      edge[j].vex->3
edge[j].weight->4      edge[j].vex->3
循环后的edge.weight的值为0, 5, 0, 5, 6, 4 :
循环后的edge.vex的值为1, 3, 1, 1, 3, 3 :


现在是第2次循环:
getMinEdge:
min:4 ,index:5
v3 --> v6, weight = 4
edge[j].weight->2      edge[j].vex->6
循环后的edge.weight的值为0, 5, 0, 2, 6, 0 :
循环后的edge.vex的值为1, 3, 1, 6, 3, 3 :


现在是第3次循环:
getMinEdge:
min:2 ,index:3
v6 --> v4, weight = 2
循环后的edge.weight的值为0, 5, 0, 0, 6, 0 :
循环后的edge.vex的值为1, 3, 1, 6, 3, 3 :


现在是第4次循环:
getMinEdge:
min:5 ,index:1
v3 --> v2, weight = 5
edge[j].weight->3      edge[j].vex->2
循环后的edge.weight的值为0, 0, 0, 0, 3, 0 :
循环后的edge.vex的值为1, 3, 1, 6, 2, 3 :


现在是第5次循环:
getMinEdge:
min:3 ,index:4
v2 --> v5, weight = 3
循环后的edge.weight的值为0, 0, 0, 0, 0, 0 :
循环后的edge.vex的值为1, 3, 1, 6, 2, 3 :


Press any key to continue

往期回顾

1.【第一章】《线性表与顺序表》
2.【第一章】《单链表》
3.【第一章】《单链表的介绍》
4.【第一章】《单链表的基本操作》
5.【第一章】《单链表循环》
6.【第一章】《双链表》
7.【第一章】《双链表循环》
8.【第二章】《栈》
9.【第二章】《队》
10.【第二章】《字符串暴力匹配》
11.【第二章】《字符串kmp匹配》
12.【第三章】《树的基础概念》
13.【第三章】《二叉树的存储结构》
14.【第三章】《二叉树链式结构及实现1》
15.【第三章】《二叉树链式结构及实现2》
16.【第三章】《二叉树链式结构及实现3》
17.【第三章】《二叉树链式结构及实现4》
18.【第三章】《二叉树链式结构及实现5》
19.【第三章】《中序线索二叉树理论部分》
20.【第三章】《中序线索二叉树代码初始化及创树》
21.【第三章】《中序线索二叉树线索化及总代码》
22【第三章】《先序线索二叉树理论及线索化》
23【第三章】《先序线索二叉树查找及总代码》
24【第三章】《后续线索二叉树线索化理论》
25【第三章】《后续线索二叉树总代码部分》
26【第三章】《二叉排序树基础了解》
27【第三章】《二叉排序树代码部分》
28【第三章】《二叉排序树代码部分》
29【第三章】《平衡二叉树基础概念》
30【第三章】《平衡二叉树的平衡因子》
31【第三章】《平衡二叉树的旋转基础详解》
32【第三章】《平衡二叉树的旋转类型图文详解》
33【第三章】《平衡二叉树的旋转类型总结及总代码》
34【第三章】《哈夫曼树简单了解》
35【第三章】《哈夫曼树的构造方法》
36【第三章】《哈夫曼编码构造及代码》
37【第四章】《图的定义》
38【第四章】《图的基本概念和术语》
39【第四章】《图的存储结构》
40【第四章】《图的遍历之深度优先遍历》
41【第四章】《广度优先遍历BFS》
42【第四章】《图的遍历总代码》
43【第四章】《最小生成树概念》
44【第四章】《最小生成树的应用举例》
45【第四章】《prim算法(普里姆算法)详解》
46【第四章】《prim算法(普里姆算法)详解2》
47【第四章】《prim算法(普里姆算法)详解3》
48【第四章】《prim算法(普里姆算法)讲解汇总》
49【第四章】《prim算法(普里姆算法)代码讲解》
50【第四章】《prim算法(普里姆算法)总代码》

  • 29
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值