新手初学数据结构1 普利姆算法

算法的内容原理比较好理解,我想说的是我在编代码的时候理解上遇到的问题,关于vexs和weight 两个数组的用途,weigh用来标记那个顶点已经访问过了,所以不能用简单的一个大for  要确保weight的作用 
#define MAX_VEX 6
#define MAX_ARC 6


typedef enum { DG, DN, UDG, UDN } Graphkind;
typedef struct {
	int adj;
	int info;
}Arcnode;
typedef struct {
	char vexs[MAX_VEX];
	Arcnode arcs[MAX_VEX][MAX_VEX];
	int vex_num, arc_num;
	Graphkind kind;
}AdjMatriax;
void createDN(AdjMatriax *G, char *a) {
	G->arc_num = MAX_ARC;
	G->vex_num = MAX_VEX;
	int i, j;
	for (i = 0; i < G->vex_num; i++) {
		for (j = 0; j < G->vex_num; j++) {
			G->arcs[i][j].adj = 0;
			G->arcs[i][j].info = 65535;
		}
	}
	for (i = 0; i < G->vex_num; i++) {
		G->vexs[i] = a[i];
	}
	int k;
	int u, v, weight;
	for (k = 0; k < G->vex_num; k++) {
		switch (k)
		{
		case 0: v = 1, u = 2, weight = 2; break;
		case 1: v = 1, u = 4, weight = 1; break;
		case 2: v = 2, u = 3, weight = 3; break;
		case 3: v = 2, u = 5, weight = 4;  break;
		case 4: v = 3, u = 4, weight = 5;  break;
		case 5: v = 3, u = 5, weight = 6;  break;
		default:
			break;
		}
		G->arcs[v - 1][u - 1].adj = 1;
		G->arcs[v - 1][u - 1].info = weight;
		G->arcs[u - 1][v - 1].adj = 1;
		G->arcs[u - 1][v - 1].info = weight;




	}
	Graphkind kind = UDN;
}
void Prim(AdjMatriax *G) {
	char vex[MAX_VEX];
	int weight[MAX_VEX];
	int start = 2;//*************************************设置开始点
	int i, j, k, m = 0;
	int min;	


	for (i = 0; i < G->vex_num; i++) {//赋予编号start的权值
					weight[i] = G->arcs[start][i].info;
	}
	weight[start] = 0;//出发点的权值为零
	vex[m] = G->vexs[start];//出存第一个点


	for (i = 0; i < G->vex_num-1; i++) {
		min = 65535;
		for (j = 0; j < G->vex_num; j++) {
			if (weight[j] < min&&weight[j] != 0) {//出发点的个链接边的最小权值
				min = weight[j];
				k = j;//k记录最小全职的点
			}
		}
		printf("%c 距离最近的点为  %c 距离为%d\n", vex[i], G->vexs[k],min);
		vex[++m] = G->vexs[k];//vex的下一个点---储存权值最小的点
		weight[k] = 0;
		
		for (j = 0; j < G->vex_num; j++) {
			if (weight[j] && G->arcs[k][j].info != 65535) {
				weight[j] = G->arcs[k][j].info;
			}
		}
	}
	for (i = 0; i < G->vex_num-1; i++) {
		printf("%c ", vex[i]);
	}
	system("pause");
}


int main()
{
	AdjMatriax *G = (AdjMatriax*)malloc(sizeof(AdjMatriax));
	char a[6] = "ABCDE";
	createDN(G, a);
	Prim(G);
	return 0;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值