数据结构图之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;
}
相关文章
|
24天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
61 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
28天前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
20 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
21天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
31 4
|
28天前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
17 0
数据结构与算法学习十四:常用排序算法总结和对比
|
28天前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
27 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
27天前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
28天前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
17 0
|
15天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
1天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
2天前
|
存储 算法 决策智能
基于免疫算法的TSP问题求解matlab仿真
旅行商问题(TSP)是一个经典的组合优化问题,目标是寻找经过每个城市恰好一次并返回起点的最短回路。本文介绍了一种基于免疫算法(IA)的解决方案,该算法模拟生物免疫系统的运作机制,通过克隆选择、变异和免疫记忆等步骤,有效解决了TSP问题。程序使用MATLAB 2022a版本运行,展示了良好的优化效果。