IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构图之prime算法详解 -> 正文阅读

[数据结构与算法]数据结构图之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;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:09:04  更:2022-05-14 10:09:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:50:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码