最小生成树prim普里姆算法

**头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define INFINITY 1000 //无穷大
#define MN 6 //图的顶点数目
typedef char vertexType;
typedef int arcType;

源代码

#include"c1.h"

typedef struct {
	vertexType vexs[MN];
	arcType arcs[MN][MN];
	int vexnum, arcnum; // 顶点数和边数
}MGraph;

MGraph G;

typedef struct{
	int fromvex, tovex;
	int cost;
}MST[MN- 1];  // 边的存储结构

MST T; //存放G的最小生成树,作为prim的输出

void CreateMGraph() {
	int i, j, k, c;
	printf("请输入图的顶点数目和边的数目: ");
	scanf_s("%d%d", &G.vexnum, &G.arcnum);
	getchar();  //收集垃圾 回车键
	printf("输入图的各项点信息: \n");
	for (i = 0; i < G.vexnum; i++)
		scanf_s("%c", &G.vexs[i]);
	for (i = 0; i < G.vexnum; i++)
		for (j = 0; j < G.vexnum; j++)
			G.arcs[i][j] = INFINITY;
	for (k = 0; k < G.arcnum; k++) {

		printf("请输入第%d条边的两个端点的序号及权值(i,j,c): ", k + 1);
		scanf_s("%d,%d,%d", &i, &j, &c);
		G.arcs[i][j] = c;
		G.arcs[j][i] = c;

	}
}
void InitCondidateSet(MGraph G,int r) {
	
	int i, k = 0;
	for (i = 0; i < G.arcnum; i++)
	{
		if (i != r) {
			T[k].fromvex = r;
			T[k].tovex = i;
			T[k].cost = G.arcs[r][i];
			k++;
		}
	}
}
int SelectLightEdge(int k)
{
	int min = INFINITY, minpos = 0;;
	for(int i = k;i<MN-1;i++)
		if (T[i].cost < min) {
			min = T[i].cost;
			minpos = i;
		}
	return minpos;
}
void ModifySet(int k, int v) {
	int d;
	for (int i = k; i < MN - 1; i++) {
		d = G.arcs[v][T[i].tovex];

		if (d < T[i].cost) {
			T[i].cost = d;
			T[i].fromvex = v;
		}
	}
}
void primMST(MGraph G, int r) {
	int m,v;
	MST e;
	InitCondidateSet(G, r);
	for (int k = 0; k < MN - 1; k++) {
		m = SelectLightEdge(k);
		e[0] = T[m];
		T[m] = T[k];
		T[k] = e[0];
		v = T[k].tovex;
		ModifySet(k + 1, v);
	}
}
int main()
{
	int num;
	CreateMGraph();
	printf("请输入第一个项点的序号: ");
	scanf_s("%d",&num);
	primMST(G, num);
	for (int i = 0; i < MN - 1; i++)
	{
		printf("第%d条边:V%d----V%d; 权值为%d\n", i + 1, T[i].fromvex, T[i].tovex, T[i].cost);
	}
	system("pause");
	return 0;
}

结果显示
在这里插入图片描述
ps: 收货:结构体数组typedef struct

typedef int arr[5];
typedef arr* p_arr5;
typedef p_arr5 arrp10[10];
	arr5 tog5;   //togs是具有5个元素的int数组
	p_arr5 p2;   //p2是一个指针,指向具有元素的数组
	arrp10 ap;   //ap是具有十个元素的指针数组,每个指针指向具有五个元素的int数组

例子
这里 MST 就是结构体数组类型

typedef struct{
	int fromvex, tovex;
	int cost;
}MST[MN- 1];  // 边的存储结构
MST T;   

等价于

struct{
	int fromvex, tovex;
	int cost;
}T[MN- 1]; 

同样情况

typedef char arr[10];
arr a;//就定义了一个有十个char型变量;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

二零二三.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值