DSA之图(4):图的应用

news2024/9/24 11:27:48

文章目录

  • 0 图的应用
  • 1 生成树
    • 1.1 无向图的生成树
    • 1.2 最小生成树
      • 1.2.1 构造最小生成树
      • 1.2.2 Prim算法构造最小生成树
      • 1.2.3 Kruskal算法构造最小生成树
      • 1.2.4 两种算法的比较
    • 1.3 最短路径
      • 1.3.1 两点间最短路径
      • 1.3.2 某源点到其他各点最短路径
      • 1.3.3 Dijkstra
      • 1.3.4 Floyd
    • 1.4 拓扑排序
      • 1.4.1 有向无环图DAG
      • 1.4.2 AOV网
    • 1.5 关键路径
      • 1.5.1 求解关键路径

0 图的应用

在这里插入图片描述

1 生成树

生成树:所有顶点均由边连接在一起,但不存在回路的图。
也就是两个条件,顶点条件和边数条件,顶点都要保持连通,边数达到最少,没有回路。
在这里插入图片描述
如右边的图,随便再加一条边就有回路了。在这里插入图片描述
所有生成树都具有以下的共同特点:

  • 生成树的顶点个数与图的顶点个数相同;
  • 生成树是图的极小连通子图,去掉一条边则非连通;
  • 一个有 n n n个顶点的连通图的生成树有 n − 1 n-1 n1条边;
  • 生成树中任意两个顶点间的路径是唯一的;
  • 含有 n n n个顶点 n − 1 n-1 n1条边的图不一定是生成树,如下图所示
    在这里插入图片描述
    因为生成树是连通的,每个顶点都要用边相连,上图是不连通的,有两个连通分量。

1.1 无向图的生成树

生成树要包含所有顶点,那么对图进行遍历,把走过的边全部加入到图当中。
遍历则采用DFS与BFS都可以。在这里插入图片描述

用DFS生成的生成树就是DFS生成树。
在这里插入图片描述
用BFS生成的生成树就是BFS生成树。
在这里插入图片描述

综上
在这里插入图片描述

1.2 最小生成树

在这里插入图片描述
最小生成树:给定一无向网络在该网的所有生成树中,使得各边权值之和最小的那棵生成树称为该网的最小生成树,也叫最小代价生成树。
最小生成树可能是不唯一的。

在这里插入图片描述

1.2.1 构造最小生成树

构造最小生成树的算法很多,其中多数算法都利用了MST(Minimum Spanning Tree)的性质。

MST性质
其实就是贪心算法,不断去找权值最小的边。
N = ( V , E ) N=(V, E) N=(V,E)以目是一个连通网, U U U是顶点集 V V V的一个非空子集。若边 ( u , v ) (u, v) (u,v)是一条具有最小权值的边,其中 u ∈ U , v ∈ V − U u∈U,v∈V-U uU,vVU则必存在一棵包含边 ( u , v ) (u,v) (u,v)的最小生成树。

举例

在这里插入图片描述
现在 U = { v 1 } U=\{v_1\} U={v1},所以 V − U = { v 2 , v 3 , v 4 , v 5 , v 6 } V-U=\{v_2,v_3,v_4,v_5,v_6\} VU={v2,v3,v4,v5,v6},所以 u ∈ U , v ∈ V − U u∈U,v∈V-U uU,vVU当中,其中从 v 1 v_1 v1 v 3 v_3 v3是最小的,权值为1,存在这个权值最小的边,这条边一定会包含在某个最下生成树当中。
在这里插入图片描述

1.2.2 Prim算法构造最小生成树

算法思想:
在这里插入图片描述

1.2.3 Kruskal算法构造最小生成树

相比Prim算法更加贪心,直截了当贪心,前提不成环。这次开始就把所有顶点都加入到最小生成树上面去。不过并不包括边,这时边的集合都是空集,没包含边,彼此之间不连通。
在这里插入图片描述
然后直接在边集合当中选权值最小的边,直接加入。在这里插入图片描述
以此类推,选到所有顶点都连通为止(前提不能形成回路)(n个点,n-1条边)。在这里插入图片描述

1.2.4 两种算法的比较

在这里插入图片描述
Prim是选择点加入的,而Kruskal是选择边的。选择边的时候和顶点数是没关系的。

1.3 最短路径

1.3.1 两点间最短路径

从起点走向终点,并非要n个节点都包括,也并非要n-1条边。在这里插入图片描述
直到找到路径长度最短的一条路径。
这种最短路径也称为单源的最短路径,采用Dijkstra算法。

1.3.2 某源点到其他各点最短路径

在这里插入图片描述
所有顶点的最短路径,统一使用Floyd弗洛伊德算法。

1.3.3 Dijkstra

其时间复杂度为 O ( n 3 ) O(n^3) O(n3)
在这里插入图片描述
按照路径长度递增次序产生最短路径,启发式贪心算法。
在这里插入图片描述
在这里插入图片描述
启发式算法,先找最短的,后面再及时更新,具体过程可以看王老师的视频。

1.3.4 Floyd

其时间复杂度为 O ( n 3 ) O(n^3) O(n3)

算法思想:

  • 逐个顶点试探
  • 从少,到的所有可能存在的路径中
  • 选出一条长度最短的路径

在这里插入图片描述
求最短路径的步骤:
初始时设置一个 n n n阶方阵,令其对角线元素(到自身的路径)为0,若存在弧 < v i , v j > <v_i, v_j> <vi,vj>,则对应元素为权值;否则为 ∞ ∞
逐步试着在原直接路径中增加中间顶点,若加入中间顶点后路径变短,则修改之;否则,维持原值。所有顶点试探完毕,算法结束。

在这里插入图片描述

1.4 拓扑排序

1.4.1 有向无环图DAG

在这里插入图片描述
在这里插入图片描述
AOV网以顶点表示活动;AOE网用弧表示活动(子工程)。
AOV网用来解决拓扑排序,AOE网用来解决关键路径问题。

拓扑排序的一个小例子:
在这里插入图片描述

1.4.2 AOV网

在这里插入图片描述
问题:如何判断AOV网中是否存在回路?

在这里插入图片描述
所有顶点都能加入拓扑排序的话,就一定没有网。

拓扑排序。
将网变成一个线性序列的过程就是拓扑排序。
在这里插入图片描述
拓扑排序的步骤:

  1. 首先构建好AOV网

在这里插入图片描述

  1. 在有向图中选一个没有前驱的顶点且输出(例如C1和C9)
  2. 假设选了C1,在有向图当中删除该顶点和所有以它为尾的弧(C1发出的弧)(即C1与C2,C4,C12的弧)
  3. 重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止在这里插入图片描述

1.5 关键路径

制定计划,查找关键路径。
关键路径就是从源点到汇点路径长度(权值之和)最长(大)的路径。

在这里插入图片描述
按照任务需求,构建有权图。
在这里插入图片描述
举例:
在这里插入图片描述

对于上方AOE网,我们关心两个问题:

  1. 完成整项女程至少需要多少时间?
  2. 哪些活动是影响工程进度的关键?

以上答为关键路径与路径长度。

1.5.1 求解关键路径

四个有用的量:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
求关键路径的步骤:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库表结构导出成文档

1.需求说明 在系统交付的过程中&#xff0c;有时候需要交付数据库的表结构&#xff0c;如果系统做的比较大&#xff0c;比如几百张表的时候&#xff0c;靠人力一张表一张的写&#xff0c;那就是一个奔溃啊。所以今天特意找了一下工具&#xff0c;小巧安装。比较好用。 2.安装…

新型恶意软件DecoyDog正大规模入侵DNS

安全厂商 Infoblox 的调查研究显示&#xff0c;一个名为 DecoyDog&#xff08;诱饵狗&#xff09;的复杂恶意工具包通过域名系统&#xff08;DNS&#xff09;&#xff0c;从事网络间谍活动已达1年以上。 目前尚不清楚该恶意软件的幕后黑手是谁&#xff0c;但 Infoblox 的研究人…

通过REST API接口上传Nexus仓库

一、Nexus API文档 API文档链接&#xff1a;Components API 二、上传API接口说明 在Nexus中可以直接调试api接口&#xff0c;url参考&#xff1a;http://localhost:8081/#admin/system/api 三、上传请求案例 $ curl -X POST "http://localhost:8081/service/rest/v1/c…

营销系统积分数据库设计

营销系统总体数据-业务功能模型 在当今日益竞争的市场中&#xff0c;如何提高客户留存率和忠诚度&#xff0c;已成为各大企业迫切需要解决的问题。而积分商城/系统作为一种新型的营销方式&#xff0c;受到青睐。 积分商城/系统是指将用户在使用产品或服务时产生的积分&#xf…

2023扩散模型最新技术进展汇总

随着Stable Diffusion和Midjourney等图像生成模型的爆火&#xff0c;今年在模型领域&#xff0c;扩散模型稳占主导地位。因此&#xff0c;与之相关的新技术也层出不穷&#xff0c;短短1个月&#xff0c;扩散模型相关的论文就有上百篇了&#xff0c;可见其发展的火热趋势。 这次…

java注解@FeignClient修饰的类路径不在spring boot入口类所在的包下,有哪几种处理方式?

一、注解EnableFeignClients 修饰在spring boot入口类&#xff0c;使得openfeign的FeignClient注解生效。 我们进一步看看注解EnableFeignClients的使用方式。 String[] basePackages() default {};Class<?>[] basePackageClasses() default {};Class<?>[] clie…

额外题目第1天|1365 941 1207 283 189 724 34 922 35 24

1365 暴力解法也能过 class Solution { public:vector<int> smallerNumbersThanCurrent(vector<int>& nums) {vector<int> result(nums.size(), 0);for (int i0; i<nums.size(); i) {int count 0;for (int j0; j<nums.size(); j) {if (nums[j]<…

互联网时代,企业经营管理面临的挑战有哪些?

随着科学技术的进步和社会经济的发展&#xff0c;大数据已经被应用到各个行业领域中&#xff0c;尤其在企业经营管理方面。通过对企业内部数据信息的利用&#xff0c;企业内部经营管理能力得到提升&#xff0c;那么在大数据时代&#xff0c;企业经营管理面临的挑战有哪些呢&…

C/C++几个关键知识点记录

1.将一个数值作为函数执行 (*(void(*)())0x13)();同理也可以将数值换成一个变量&#xff1a; int var0x13; (*(void(*)())var)();2.断言assert 用于判断输入的参数是否正确&#xff0c;实际就是判断输入的参数是否为0&#xff0c;如STM32的固件库中常用的assert_param()&…

Ceph入门到精通- Linux 磁盘管理(block 与 inode)

1 硬盘 block 与 inode 详解 1.1 Sector&#xff08;扇区&#xff09;与 Block&#xff08;块&#xff09; 1&#xff09; 硬盘的最小存储单位&#xff1a;sector&#xff08;扇区&#xff09;&#xff0c;每个扇区储存 512 字节&#xff1b;操作系统会一次性连续读取多个…

抖音短视频seo矩阵系统源码开发部署技术分享

抖音短视频的SEO矩阵系统是一个非常重要的部分&#xff0c;它可以帮助视频更好地被搜索引擎识别和推荐。以下是一些关于开发和部署抖音短视频SEO矩阵系统的技术分享&#xff1a; 一、 抖音短视频SEO矩阵系统的技术分享&#xff1a; 关键词研究&#xff1a;在开发抖音短视频SEO矩…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 之一开头。

✍️作者简介&#xff1a;沫小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北 CSDN、51cto博客、稀土掘金、简书、知乎、开源中国、博客园、慕课网 &#x1f310;系列专栏&#xff1a;码农小北 &#x1f514;如果文…

防止连点..

1.连点js文件 let timer; letflag /*** 节流原理&#xff1a;在一定时间内&#xff0c;只能触发一次** param {Function} func 要执行的回调函数* param {Number} wait 延时的时间* param {Boolean} immediate 是否立即执行* return null*/ function throttle(func, wait 500…

[Java] 单例设计模式详解

模式定义&#xff1a;保证一个类只有一个实例&#xff0c;并且提供一个全局访问点&#xff0c;时一种创建型模式 使用场景&#xff1a;重量级的对象&#xff0c;不需要多个实例&#xff0c;如线程池&#xff0c;数据库连接池 单例设计模式的实现 1.懒汉模式&#xff1a;延迟…

牛客上面的约瑟夫环问题

对于本题 我感觉还是链表做起来舒服 数组也可以做 但是数组需要去控制循环 不太好控制 我之前搞了 最后看别人的实现 但是链表搞了一次就搞好了 香的嘞~ 下面是代码 用单链表实现循环 再去删除要删除的人 5个人 数到2 你们在纸上画图 我就不画了 对于数组实现你们可以去…

python读取json文件

import json# 文件路径(同目录文件名即可,不同目录需要绝对路径) path 1.json# 读取JSON文件 with open(path, r, encodingutf-8) as file:data json.load(file)#data为字典 print(data) print(type(data))

前端Vue入门-day03-用Vue实现工程化、组件化开发

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 生命周期 Vue 生命周期 和 生命周期的四个阶段 Vue 生命周期函数&#xff08;钩子函数&#xff09; 案例…

为公网远程访问树莓派配置一个固定TCP地址

今天我们就为大家介绍&#xff0c;如何设置cpolar&#xff0c;为树莓派的SSH构建一个永久固定TCP地址。 如果看过我们之前的文章介绍&#xff0c;就会很轻易的发现&#xff0c;能够让公共互联网通过SSH访问树莓派的关键&#xff0c;是cpolar打通的数据隧道&#xff0c;因此想要…

【双指针优化DP】The 2022 Hangzhou Normal U Summer Trials H

Problem - H - Codeforces 题意&#xff1a; 思路&#xff1a; 首先很明显是DP 因为只有1e6个站点&#xff0c;因此可以以站点作为阶段 注意到K很小&#xff0c;因此可以尝试把这个当作第二维 设dp[i][j]为到达第i个站点&#xff0c;已经花了j元钱的最小步数 然后就想了一…

Redis持久化机制 RDB、AOF、混合持久化详解!如何选择?| JavaGuide

本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。) Redis 持久化机制属于后端面试超高频的面试知识点,老生常谈了,需要重点花时间掌握。即使不是准备面试,日常开发也是需要经常用到的。 最近抽空对之前写的 Redis 持久化…