一张图看懂数据结构-——图

2023-11-06

在这里插入图片描述

最小生成树

Prim算法

图解
在这里插入图片描述
一些说明:
min_weight数组表示该集合到达剩余顶点的最小值
adjvex表示这个最小权值是由哪个顶点引入
每次选取最小的权值顶点加入后,需要更新min_weight的数值,选取值变为0,全部都为0时表示树已经生成

代码

void MST_Prim(Grap G)
{
    //初始化部分
    int min_weight[G.vexnum];
    int adjvex[G.vexnum];
    for (int i=0;i<G.vexnum;i++)
    {
        min_weight[i]=G.Edge[0][i];//赋值第0个顶点到其他边的权值
        adjvex[i]=0;
    }

    int min_arc;//弄两个缓存下变量
    int min_vex;
    for(int i=1;i<G.vexnum;i++)//少了一个顶点,故从这里开始
    {
        //挑选出最小权值的顶点
        min_arc=MAX;
        for(int j=1;j<G.vexnum;j++)
            if(min_weight[j]!=0 && min_weight[j]<min_arc)
            {
                min_arc=min_weight[j];
                min_vex=j;
            }
        
        //重新分配该集合权重,并去掉该顶点,以及记录最小权值是从哪条边发出
        min_weight[min_vex]=0;
        for(int j=0;j<G.vexnum;j++)
        {
            if(min_weight[j]!=0 && G.Edge[min_arc][j]<min_weight[j])
            {
                min_weight[j]=G.Edge[min_arc][j];
                adjvex[j]=min_arc;
            }

        }
    }
}

Kruskal

图解
在这里插入图片描述
一些说明:
要判断图中有没有回路,只需要判断两个顶点在并查集中有没有共同根,有的话加入就变成有回路了。

代码

type struct Edge//边信息
{
    int a,b;
    int weight;
}
void MST_Kruskal(Graph G, Edge* edges, int* parent)
{
    heap_sort(edges);//对所有边进行排序
    Initial(parent);//初始化数组为-1
    for(int i=0;i<G.arcnum;i++)
    {
        //每次加入新边时候,查找该边的两个顶点是否有公共根,没有就加入新树
        int a_root=Find(parent,edges[i].a);
        int b_root=Find(parent,edges[i].b);
        if(a_root!=b_root)
            Union(parent,a_root,b_root);
    }
}

最短路径

Dijkstra算法(迪杰斯特拉)

步骤描述
在这里插入图片描述
在这里插入图片描述
图解
每次挑选出权值最小的没有用过的顶点加入,然后遍历顶点的边,看看通过该顶点能否使得对应路径变短
在这里插入图片描述
查找路径
在这里插入图片描述
代码


void Dijkstra(Graph G,int V)
{
    //初始化开始的三个数组
    int s[G.vexnum];
    int path[G.vexnum];
    int dist[G.vexnum];
    for(int i=0;i<G.vexnum;i++)
    {
        dist[i]=G.edge[v][i];
        s[i]=0;
        if(G.edge[v][i]<MAX)
            path[i]=v;
        else
            path[i]=-1;
    }
    //一开始引用的顶点要初始化
    s[v]=1;
    path[v]=-1;

    //正文
    for(i=0;i<G.vexnum;i++)
    {
        int min=MAX;
        int u;

        //挑选最小而且没用过的顶点
        for(int j=0;j<G.vexnum;j++)
            if(s[j]==0 && dist[j]<min)
            {
                min=dist[j];
                u=j;
            }
        s[u]=1;

        //遍历该顶点各边,小于就更新
        for(int j=0;j<G.vexnum;j++)
            if(s[j]==0 && dist[u]+G.Edge[u][j]<dist[j])
            {
                dist[j]=dist[u]+G.Edge[u][i];
                path[j]=u;
            }
    }
}

Floyd算法(弗洛伊德)

步骤
在这里插入图片描述
图解
在这里插入图片描述

代码

void Floyd(Graph G)
{
    //初始化
    int A[G.vexnum][G.vexnum];
    for(int i=0;i<G.vexnum;i++)
        for(int j=0;j<G.vexnum;j++)
            A[i][j]=G.Edge[i][j];

    //依次加入顶点,然后依次遍历整个矩阵检查
    for(int k=0;k<G.vexnum;k++)
        for(int i=0;i<G.vexnum;i++)
            for(int j=0;j<G.vexnum;j++)
                if(A[i][j]>A[i][k]+A[k][j])
                    A[i][j]=A[i][k]+A[k][j];
}

拓扑排序

应用
在课程排序中,由课程关系得到一个AOV网络,然后根据排课需要输入的就是拓扑排序了。
在这里插入图片描述
在这里插入图片描述
算法描述
在这里插入图片描述
算法图解
在这里插入图片描述
在这里插入图片描述

关键路径

经典应用
在这里插入图片描述
在这里插入图片描述


觉得好记得点个赞|ू・ω・` )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一张图看懂数据结构-——图 的相关文章

  • 发布的qt程序出现libQt5Core.so.5 版本问题

    原因 发布版本跟别的机器qt环境不一样导致 解决方法 把 1 在客户机 去掉 bashrc 关于qt的环境变量 2 同样的方式去掉 etc profile的环境变量 或者吧qt的环境变量修改正确 因为你发布的软件首先回去系统路径中链接相关库

随机推荐

  • 28 openEuler管理网络-配置主机名

    文章目录 28 openEuler管理网络 配置主机名 28 1 简介 28 2 使用hostnamectl配置主机名 28 2 1 查看所有主机名 28 2 2 设定所有主机名 28 2 3 设定特定主机名 28 2 4 清除特定主机名
  • 【得物技术】自动化生成代码几种方案的演变

    今天我们聊一聊自动化生成代码的问题 试想一下 假如有一天机器替代你编写代码 你是应该感到开心还是难过 方案 目前代码生成技术主要有以下几类 1 基于模版编排生成代码 首先说下基于模版生成代码的方式 这种属于最原始最简单也是目前应用最广泛的一
  • egg.js和nest.js的对比

    egg js和nest js的对比 前几天突然看到一个群在说现在用egg的人已经很少了 说用nest的人比较多 然后我就做了一个简单的调查和对比 egg和nest都是比较优秀的框架 但是两个框架有比较大的区别 我主要分为六个方面来分析egg
  • web socket

    package com web import java io IOException import java util concurrent CopyOnWriteArraySet import javax websocket import
  • Mysql增加传输数据量或连接时间,防止mysql server has gone away报错

    首先登录进mysql mysql u root p 这个需要修改数据库配置的权限 修改数据传输量 默认是1M的数据量 数据量过大时会不够用 因此增加阈值 如下代码为100M show variables like max allowed p
  • 相机与激光雷达联合标定(二)

    前言 LiDAR Camera Calibration LCC 系列 主要介绍激光雷达相机外参标定相关内容 本文主要介绍相关的开源代码和软件 主要包括target based和targetless两类方法 每个方法对应标题后说明了方法的提出
  • [C/C++基础知识] main函数的参数argc和argv

    该篇文章主要是关于C C语言最基础的main函数的参数知识 是学习C 或C语言都必备的知识点 不知道你是否知道该知识 希望对大家有所帮助 一 main 函数参数通常我们在写主函数时都是void main 或int main return 0
  • CPU的工作原理

    一 CPU的基本概念 CPU 中央处理器 是一块超大规模的集成电路 是一台计算机的运算核心和控制核心 主要功能是解释计算机指令和处理计算机软件中的数据 二 CPU的组成部分 1 运算器 运算器是对数据加工和处理的中心 由算术逻辑单元 状态寄
  • TLS回调函数的两种写法

    include
  • 泛型+通配符(数学角度)

    打破常规 换个角度重新认识泛型和通配符 跳转提示 如果已经熟悉泛型基础知识的小伙伴可以直接跳过引入泛型这一部分 因为这一部分是关于泛型的基础知识的讲解 文章篇幅较长 想看换个角度认识泛型的部分 可以直接跳过引入泛型这部分 直接看从数学函数角
  • windows安裝mysql步骤

    1 mysql安装分为两种 一种是msi格式的 一种是zip格式的 zip格式相当于绿色版 不需要安装 只需解压缩之后就可以使用了 但是要进行配置 msi格式是安装版 2 mysql官网下载 https www mysql com 3 安装
  • 金融行业知识汇总

    文章目录 一 名词解释 1 一级市场 二级市场 2 投行 PE VC 1 投行 Investment Bank IB 2 VC PE 风险投资 Venture Capital VC 私募股权投资 Private Equity PE 3 买方
  • Apache2.4.23--解析漏洞

    复现环境 Apache文件解析漏洞与用户的配置有密切关系 严格来说属于用户配置问题 Apache文件解析漏洞涉及到一个解析文件的特性 Apache默认 个文件可以有多个以点分隔的后缀 当右边的后缀无法识别 则继续向左识别 发现后缀是 php
  • 强大的JTAG边界扫描(4):STM32边界扫描应用

    文章目录 1 获取芯片的BSDL文件 2 硬件连接 3 边界扫描测试 4 总结 试想这样一个场景 我们新设计了一款集成了很多芯片的板卡 包括BGA封装的微控制器 如FPGA MCU 还有LED 按键 串口 传感器 ADC等基本外设 我们需要
  • Unity 导出的EXE文件关闭时卡死崩溃

    Unity 导出的EXE文件关闭时崩溃 前言 项目分析情况 解决方法一 结论 前言 这个问题出现在Unity导出的可执行文件发生在需要关闭应用程序时无法正常关闭 只能从任务管理器中直接杀死进程 虽然这一步的目的是关闭程序但无法走正常途径就很
  • kettle中时间转换日期格式

    为什么80 的码农都做不了架构师 gt gt gt 经常会用到获取今天日期 但是在kettle中没有日期格式 只有时间格式 我们只有把时间格式转换成日期格式 第一步获取系统信息 第二步选择 改名值 第三步打印输出即可 转载于 https m
  • 【Java入门】统计字符串中“ a ~ z “各个字符出现的次数

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 知识点 二 代码 三 运行截图 前言 入门版统计字符串中 a z 各个字符出现的次数 如果需要查询某个字符出现的次数可以写成一个方法 一 知识点 Scan
  • 微信小程序实现文字长按复制、一键复制功能

    一 不引入外部组件的实现方式
  • 将mysql服务启动类型设置为手动或自动提示拒绝访问

    可能被360或者火绒禁止了 直接去火绒 安全工具 启动项管理 服务项 显示禁用的启动项 找到Mysql56允许启动 这里说一下打开Mysql服务的命令 net start mysql56 卸载mysql服务还在 需要删除mysql服务 sc
  • 一张图看懂数据结构-——图

    最小生成树 Prim算法 图解 一些说明 min weight数组表示该集合到达剩余顶点的最小值 adjvex表示这个最小权值是由哪个顶点引入 每次选取最小的权值顶点加入后 需要更新min weight的数值 选取值变为0 全部都为0时表示