图的应用(最小生成树,最短路径,有向无环图)

简介: 图的应用(最小生成树,最短路径,有向无环图

一.最小生成树

1.生成树

所有顶点均有边连接在一起,但不存在回路的图



•一个图可以有许多棵不同的生成树


•所有生成树都具有以下共同特点


        •生成树的顶点个数与图的顶点个数相同


        •生成树是图的极小连通子图,去掉一条边则非连通


        •一个有n个顶点的连通图的生成树有(n-1)条边


        •在生成树中再加一条边必然形成回路


        •生成树中任意两个顶点间的路径是唯一的


•含n个顶点n-1条边的图不一定是生成树


2.无向图的生成树

无向图的生成树可以与深度优先搜索遍历与广度优先搜索遍历的方法结合起来


不了解的可以看看这篇


深度优先搜索遍历与广度优先搜索遍历


深度优先生成树:V1->V2->V4->V8->V5->V3->V6->V7


广度优先生成树:V1->V2->V3->V4->V5->V6->V7->V8


3.最小生成树算法

给定一个无向网络,在该网所有的生成树中,使得各边权值之和最小的那棵生成树称为最小生成树,也叫最小代价生成树


生成最小生成树的方法


MST(Minimum Spanning Tree)


•已落在生成树上的顶点集:U


•尚未落在生成树的顶点集:V-U


       •选取权值最小的边,因为权值最小的边一定存在生成树是包含他的


(1)普里姆(Prim)算法


•设N=(V,E)是连通网,TE是N上最小生成树中边的集合

•初始令 U={u0},(u0V), TE={}


•在所有 uU, v V-U的边(u v)E中,找条代价最小的边(u0,v0)


•将(u0,v0)并入集合 TE,同时v0并入 U



(2)克鲁斯卡尔(Kruskal)算法


•设连通网 N=(V,E),令最小生成树初始状态为只有 n个顶点而无边的非连通图T=(V,{}),每个顶点自成一个连通分量。


•在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上(即:不能形成环),则将此边加入到 T中;否则,舍去此边,选取下一条代价最小的边。

•依此类推,直至T中所有顶点都在同一连通分量上为止。



(3)两种算法的区别

•普里姆算法是选择点,从U集合到V-U集合找一条权值最小的边,将这个边连接的点加入到U集合中,而克鲁斯卡尔算法则是在所有边中找权值最小的边,加入到生成树中,直到所有的点连通,边为n-1条。


•普里姆算法的时间复杂度为O(),对于所有的点,都需要遍历其他顶点进行判断下一个加入生成树的点,克鲁斯卡尔算法则是选择边,和顶点数无关,只跟边数有关,对顶点的权值进行排序时,平均情况是(eloge)


•克鲁斯卡尔算法时间复杂度只跟边数有关,所以边数较少时,算法时间较少,所以克鲁斯卡尔算法适用于稀疏图,普里姆算法适用于稠密图。



二.最短路径

在有向网中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径


最短路径与最小生成树不同,路径上不一定包含n个顶点,也不一定包含n-1条边


•两点间的最短路径


下图最短路径值为14



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



1.单源最短路径---Dijkstra(迪杰斯特拉)算法

算法步骤


•初始时令S={v0},T={其余顶点}


•T中顶点对应的距离值用辅助数组D存放


       •D[i]初值:若<v0,>存在,则为权值;否则为


•从T中选取一个其距离值最小的顶点,加入S


•对T中顶点的距离值进行修改:若加进作中间顶点,从v0到的距离值比不加的路径要短,则修改此距离值。


•重复上述步骤,直到S=V为止


以下图为例



Dijkstra(迪杰斯特拉)算法可以计算1个顶点到其他顶点的最短路径,时间复杂度为O()


如果要计算所有顶点间的最短路径,即O()*n=O()


2.所有顶点间的最短路径---Floyd(弗洛伊德)算法

算法步骤


•逐个顶点试探


•从vi到vj的所有可能存在的路径中


•选出一条长度最短的路径


初始设置一个n阶方阵,令其对角线元素为0,若存在弧<vi,vj>,则对应元素为权值;否则为


如图:A-->B的权值为4,B-->A的权值为6,以此类推,可得n阶方阵



加入A顶点,如图,本来C--->B没有路径(),但是可以从C-->A--->B,路径长度为7



加入B,如图,原来A--->C为11,现在加入B,变为A--->B--->C,变得更小了,所以6替换11



加入C,如图,B--->A路径长度为6,B--->C--->A路径长度变短,所以5替换6



以上总结为:逐步试着在原直接路径中增加中间顶点,若加入中间顶点后路径变短,则修改之;否则,维持原值。所有顶点试探完毕,算法结束。


三.有向无环图的应用

1.AOV网(拓扑排序)

用一个有向图表示一个工程的各子工程及其相互制约的关系,其中以顶点表示活动,弧表示活动之间的优先制约关系,称这种有向图为顶点表示活动的网,简称 AOV网(Activity On Vertex network)


拓扑排序


拓扑排序的方法


•在有向图中选一个没有前驱的顶点且输出之


•从图中删除该顶点和所有以它为尾的弧


•重复上述两步,直至全部顶点均已输出或者当图中不存在无前驱的顶点为止


注:拓扑排序的结果是不唯一的



拓扑排序可以检测AOV网中是否存在环


对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV 网必定不存在环,若还剩余顶点没有在拓扑有序序列中,就存在环


2.AOE网(关键路径)

用一个有向图表示一个工程的各子工程及其相互制约的关系,以弧表示活动,以顶点表示活动的开始或结束事件,称这种有向图为边表示活动的网,简称为AOE网(Activity On Edge)。


关键路径

关于关键路径,可以看这篇文章


http://t.csdn.cn/uitVf


如果想要理解的再深入一些,可以看



目录
相关文章
|
搜索推荐 数据可视化 数据挖掘
seaborn从入门到精通04-主题颜色设置与总结
seaborn从入门到精通04-主题颜色设置与总结
seaborn从入门到精通04-主题颜色设置与总结
|
存储 安全 Java
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
ArrayBlockingQueue 和 LinkedBlockingQueue 有什么区别?
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习与自然语言处理的最新进展
探索深度学习与自然语言处理的最新进展
315 0
|
关系型数据库 MySQL 数据库
MySQL数据库基础第四篇(多表查询与事务)
MySQL数据库基础第四篇(多表查询与事务)
|
SQL 存储 监控
ads基础使用教程
【8月更文挑战第6天】
1971 2
|
物联网 智能硬件
物联卡选择指南
本物联卡选择指南助您根据设备类型与数量、流量需求来明确需求;了解普通物联网卡、物联网语音卡、NB-IoT卡及陶瓷卡等种类及其适用范围;考虑网络覆盖和服务质量以确保性能;对比套餐价格并控制成本;评估客户服务和售后保障;关注兼容性、安装方式及实名认证等特性,最终选出符合需求且性价比高的物联卡。
|
Java API 容器
Java8函数式编程接口:Consumer、Supplier、Function、Predicate
Java8函数式编程接口:Consumer、Supplier、Function、Predicate
908 1
|
存储 缓存 Java
深入理解 go chan
深入理解 go chan
268 0
|
存储 安全 Java
Java线程池ThreadPoolExcutor源码解读详解03-阻塞队列之LinkedBlockingQueue
LinkedBlockingQueue 和 ArrayBlockingQueue 是 Java 中的两种阻塞队列实现,它们的主要区别在于: 1. **数据结构**:ArrayBlockingQueue 采用固定大小的数组实现,而 LinkedBlockingQueue 则使用链表实现。 2. **容量**:ArrayBlockingQueue 在创建时必须指定容量,而 LinkedBlockingQueue 可以在创建时不指定容量,默认容量为 Integer.MAX_VALUE。 总结起来,如果需要高效并发且内存不是主要考虑因素,LinkedBlockingQueue 通常是更好的选择;
397 1
|
机器学习/深度学习 存储 搜索推荐
可能是推荐系统最详细且简单的入门教程
本文将深入介绍推荐系统的工作原理,和其中涉及的各种推荐机制,以及它们各自的优缺点和适用场景,帮助用户清楚的了解和快速构建适合自己的推荐系统。
2770 0
可能是推荐系统最详细且简单的入门教程