数据结构图之prime算法详解

本篇为文章是写的prime算法,本人见书上算法只有伪代码于是想着写出一个能跑的prime算法

本人写了一个下午的prime算法,但是运行的结果是不正确的 (本人是个小菜鸡) 经过朋友的帮助,运行结果正确。

我觉得算法主要先理解思想   在去试图打出分部的伪代码 最后打出能跑的代码

不多说上代码

# include <stdio.h>
# define  m 31715
# define maxs 100
typedef struct {
	int v[maxs];         // 顶点表
	int arc[maxs][maxs];//边表
	int v1, a1, w;      //顶点数  和边数  权数
} tu;

int getid(tu t, int i) {
	for (int j = 0; j < t.v1; j++) {
		if (i == t.v[j])
			return j;
	}

	return -1;
}
tu creat (tu t) {
	printf("请输入定点数和边数");
	//输入顶点数    边数
	scanf("%d", &(t.v1));
	//	printf("进行到这了");
	scanf("%d", &(t.a1));

	for (int i = 0; i < t.v1; i++) { //初始化  顶点表
		printf("请输入顶点");
		scanf("%d", &t.v[i]);
	}

	printf("请输入边的权值");

	for (int i = 0; i < t.v1; i++) {
		for (int j = 0; j < t.v1; j++) {

			scanf("%d", &t.arc[i][j]);
			t.arc[j][i] = t.arc[i][j];
		}
	}
 for(int i=0;i<t.v1;i++)
     {
         for(int j=0;j<t.v1;j++)
         {
             printf("%d ",t.arc[i][j]);
         }
         printf("\n");
     }  


	return t;

}
void prime(tu *t) {
	int tree[t->v1];  //用于存放邻接节点
	int adjest[t->v1]; 
	int lowcost [t->v1];  //用于存放到各边的权值
//初始化
	for (int i = 0; i < t->v1; i++) {
		lowcost[i] = t->arc[0][i];  //    先按以0为起点   到各边的权值
		adjest[i]=0;
		tree[i] = 0;	               //表示  各边均以 0  为起点
	}
//寻找   lowcost中最小值
//要遍历
    int cnt=0;
	for (int w = 1; w < t->v1; w++) {
		
		int min, k;min = 32767;//设置初始最小值
		for (int i = 1; i < t->a1; i++) { //进行遍历     找到  lowcost中最小值   来确定  下一个进树的节点
			
			if (lowcost[i] < min && lowcost[i] > 0) { //     =0   表示已经进树
				min = lowcost[i] ;						//赋值
				k = i;					           //记录i的值  用于后续进树操作和更新lowcost操作
			}
		}
		tree[++cnt] = k;
		lowcost[k] = 0;
		for (int i = 1; i < t->v1; i++) { //为什么从1开始  ?    因为  lowcost数组中第一个数已经在树中  lowcost【0】=0;一定不满足下边if语句
			if ( (lowcost[i]<0 || lowcost[i] > t->arc[k][i] )&& t->arc[k][i] >= 0) {
				lowcost[i] = t->arc[k][i]; //   当满足if语句时    说明lowcost需要更新  把二维数组中的k行i列数据进行赋值
				             //表示这条边的起点为  k
				//	printf("here");
				adjest[i]=k;
			}
		}
	}
	printf("入树的顺序");
	for (int i = 0; i < t->v1; i++) {
		printf("%d ", tree[i]);
	}
printf("\n");
printf("边的前驱"); 
	for (int i = 0; i < t->v1; i++) {
		printf("%d ", adjest[i]);
	}

}


int main() {
	tu  t;
	t = creat(t);
	prime(&t);


	/*
	prime    算法
	   		     建立 lowcost  数组
					用于存放最小生成树的邻接边
					 如果两条边都指向同一个顶点    则 把最小的存入   lowcost
		设置最小值   min   =312715
		 比min小  则会进行  赋值
		 用for循环   进行全部比较
		 最后保留的是   最小权的下标和权值
		  下标的   lowcost    为0   则表示进树

		  则   lowcost会更新
		  如果   新进入树的节点的二维数组 中 第i个值   比lotcost   中第i个值   小则赋值
		  tree[i]=k;		k  是    进入树的节点的下标
		  输出tree
	*/



	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_61469860/article/details/124734430