算法基础:图的相关算法知识笔记

一、图的相关算法

1、图的分类知识

如下图:

             

2、生成树概念

对连通图进行遍历,过程中所经过的边和顶点的组合可看做是一棵普通树,通常称为生成树。

连通图的生成树具有这样的特征:边的数量 = 顶点数 - 1

3、最小生成树

在连通网的所有生成树中,所有边的代价和权值最小的生成树,称为最小生成树。

             

4、 最小生成树的算法

4.1普里姆算法(Prim算法)

它是图论中的一种算法,可在加权连通图里搜索最小生成树。即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。

算法如下:

void prim(MGraph g,int v)

{

    int lowcost[MAXV],min,n=g.vexnum;

    int closest[MAXV],i,j,k;

    for (i=0;i<n;i++)           //给lowcost[]和closest[]置初始值

    {   

        lowcost[i]=g.edges[v][i];

        closest[i]=v;

    }

    for (i=1;i<n;i++)           //找出n-1个顶点

    {   

        min=INF;

        for (j=0;j<n;j++)       //在(V-U)中找出离U最近的顶点k

            if (lowcost[j]!=0 && lowcost[j]<min) 

            {   

                min=lowcost[j];k=j;  

            }

        printf("  边(%d,%d)权为:%d\n",closest[k],k,min);

        lowcost[k]=0;           //标记k已经加入U

        for (j=0;j<n;j++)       //修改数组lowcost和closest

            if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j]) 

            {   

                lowcost[j]=g.edges[k][j];closest[j]=k; 

            }

    }

}

算法过程

 

             

 

4.2 克鲁斯卡尔(Kruskal)算法

1、概念

该算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。

2、算法步骤

1. 把图中的所有边按代价从小到大进行排序;

2. 把图中的n个顶点看成独立的n棵树组成的森林;

3. 按权值从小到大选择边,所选的边连接的两个顶点,应属于两颗不同的树,则成为最小生成树的一条边,并将这两颗树合并作为一颗树。

4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。

3、算法过程

                           

5、最小生成树算法的应用

比如要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,因为铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光缆的总费用最低。这个时候需要找到带权的最小生成树,来解决这个问题。

 

二、拓扑排序

1、定义

由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。

2、AOV网

在工程领域,一个大的工程通常会被划分为许多较少的子工程,当子工程都完成了,那么整个大工程也就完成了。若以顶点表示活动,用有向边表示子工程之间的优先关系。这样的有向图以顶点表示活动的网就是AOV网。AOV网表示了子工程之间的优先关系,也是活动进行时的制约关系。

3、拓扑排序

拓扑排序是将AOV网中所有的顶点排成一个线性序列的过程。并且满足:若在AOV网中从顶点A到B有一条路径,那么A比然在B之前。

4、执行步骤

(1) 选择一个入度为0的顶点并输出之;

(2) 从网中删除此顶点及所有出边。

循环结束后,若输出的顶点数小于网中的顶点数,则输出“有回路”信息,否则输出的顶点序列就是一种拓扑序列。 

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

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

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

相关文章

java中break和continue的用法例子

break用于switch语句 1. break用于switch语句中&#xff0c;终止switch语句 下面先看 加上break,效果如下 我们可以看到&#xff0c;没有用过break关键字时&#xff0c;不会在判断下一个case的值&#xff0c;直接向后运行&#xff0c;直到遇到break&#xff0c;或者整体swit…

ftp 工具_ftp工具,ftp工具有哪些

对于ftp工具&#xff0c;你了解多少&#xff1f;其实一般人也接触不到这种软件。ftp工具主要是针对从事网站管理的工作人员比较有利的一款工具。可以帮助他们快速的解决工作中的问题。方便、简单、快捷又明了的解决问题。那ftp工具有哪些呢&#xff1f;接下来给大家推荐四款好用…

盘点世界十大软件外包公司排名是哪些公司

排名第一:IBMIBM,总部在纽约的阿蒙克。托马斯沃森19世纪80年代在美国成立,是全球最大的信息技术和商业解决方案公司,在全球拥有超过30万名员工,业务遍及160多个国家和地区。电脑上的制作非常出名,事实上,IBM在软件方面取得了巨大的成就,特别是在一些IBM服务器上使用的软件平台上…

判断不为空和不为空串的方法java

判断不为空和不为空串的方法 方法一:用StringUtils工具类 首先要引入依赖 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId> </dependency> if( StringUtils.isNotBlank(str3) && St…

android xml事件,安卓事件

1、自定义内部类2、匿名内部类3、当前activity去实现事件接口4、在布局文件xml中添加点击事件属性(使用频率非常高)补充&#xff1a;a、Android 在xml文件中 给某个控件声明 id 是: "/自定义名字" &#xff0c;获取是&#xff1a; "/自定义的名字" &#x…

Cocos2d-x v3.0物理系统 利用PhysicsEditor创建多边形

Cocos2d-x 3.0的新物理系统我就不必多说了&#xff0c;接触一段时间&#xff0c;感觉还是不错的。对于那些基本概念&#xff0c;网上的教程已经泛滥了&#xff0c;就不多说了&#xff0c;不过对于创建多边形物体的教程&#xff0c;还真不多&#xff0c;很多都是创建圆形和矩形&…

公众号开发 单独 给某个用户 推送消息_韩国5G用户6月底已达134万 较5月底增加近70%...

中关村在线消息&#xff1a;韩国三大运营商SK、KT和LG率先于去年12月开始向企业用户提供商用5G 服务&#xff0c;今年4月初推出面向个人消费者的5G民用服务。韩国作为全球首个推出5G 服务的国家&#xff0c;他们的5G用户数量在6月时已经突破100万大关。日前韩国公布6月底最新的…

程序语言的概念知识笔记

1、低级语言和高级语言 计算机指令程序&#xff1a;0、1 组成的机器指令序列。特点&#xff1a;效率低、可读性差、难以维护。 汇编指令&#xff1a;用常用的符号代替0、1 序列来 表示机器指令&#xff0c;例如用ADD表示加法。 高级语言&#xff1a;面向对象设计的各类应用的程…

java lambda 表达式中的双冒号和箭头的用法 ::

先构造一些数据,创建一个User类 java lambda 表达式中的双冒号的用法 &#xff1a;&#xff1a; 双冒号运算就是Java中的[方法引用],[方法引用]的格式是 类名::方法名 如下图所示 User是一个类, getAge是方法名,注意是方法名呀&#xff0c;后面没有括号()的。为什么不要括号…

linux内核设计与实现 中文第三版 pdf_大牛推荐的5本 Linux 经典必读书

今天给大家推荐5本Linux学习相关的书籍&#xff1b;这些书籍基本都是很多大牛推荐过&#xff0c;并且深受业界好评的书&#xff1b;虽然只有5本&#xff0c;但是相信把5本全都认真看过的同学应该不多吧&#xff1f;希望这些书能够帮助你进阶为大牛&#xff01;5.《鸟哥的 Linux…

号称最好的国产操作系统在 Windows 10 面前能否一战?

统信软件旗下的UOS操作系统正式推出UOS V20个人版&#xff0c;并开启99元预售活动。统信UOS虽名不见经传&#xff0c;但身披“国产操作系统”外衣的它却让科技圈炸开了锅。有人说它是“国货之光”&#xff0c;堪称最好的国产系统&#xff0c;但也因为“收费”的问题引发一致批评…

js打开android应用程序,浏览器通过JS打开Android程序

做项目的时候&#xff0c;项目中有个需求&#xff0c;需要通过网页打开app&#xff0c;听到这个功能&#xff0c;我先是蛋疼了一会&#xff0c;但是在网上查了一下资料发现原理其实很简单&#xff0c;本质就是通过浏览器输入我们本地android程序的路径&#xff0c;不过这个路径…

lamba统计最大值,最小值,平均值,总和,个数

代码如下: List<Integer> ages Arrays.asList(1,3,5,7,8,10,12); IntSummaryStatistics intSummaryStatistics ages.stream().mapToInt(e -> e).summaryStatistics(); System.out.println("最大值: " intSummaryStatistics.getMax()); System.out.print…

程序语言的组成知识笔记

程序语言的基本成分包括数据‘运算、控制、传输。 1、程序语言的数据成分 数据成分指程序中的数据对象&#xff0c;数据是程序程序操作的对象&#xff0c;具有存储类型、数据类型、数据名称、作用域、生存周期等属性。 1.1 常量和变量 按照程序运行时数据能否改变&#xff0c;将…

python车牌识别逆光怎么办代码_这摄像头除了能逆光识别车牌,还会跟人打招呼?...

前段时间&#xff0c;笔者偶然在某宝上发现了一款变光全彩的智能警戒摄像头&#xff01;这款摄像头的型号为JA-F8&#xff0c;是一台室外防水枪机。说实话&#xff0c;这东西外观有点奇葩&#xff0c;谈不上好看。但正是因为它“骨骼精奇”&#xff0c;我才抱着好奇的心态点了进…

Executors创建线程池

java jdk1.5提供线程池 在java.util.concurrent包下提供工厂类Executors用于生产线程池&#xff0c;Executors提供了4种线程池 newFixedThreadPool&#xff1a; 创建一个线程池&#xff0c;该线程池重用固定数量的从共享无界队列中运行的线程。 newScheduledThreadPool&#x…

Maven项目中使用JUnit进行单元测试

1.打开maven项目中的pom.xml&#xff0c;添加JUnit 的jar包 2.在src/test/java下右键新建JUnit Test Cast 转载于:https://www.cnblogs.com/liaojie970/p/5588326.html

汇编程序基本原理知识笔记

1、汇编语言的概念 定义&#xff1a;为特定计算机或计算机系统设计的面向机器的符号化程序设计语言。汇编程序也就是用汇编语言编写的程序。计算机要运行汇编程序需要用专门的翻译程序进行翻译&#xff0c;然后计算机才可以识别。 汇编语句的分类&#xff1a;指令语句、伪指令语…

linux虚拟主机_Windows虚拟主机和linux虚拟主机有什么区别?

不少租用虚拟主机的用户在问一个同样的问题&#xff1a;windows空间和linux空间哪个好?这里给大家做一下全面的科普。一、windows空间和linux空间的区别系统的不同①windows空间则是由windows系统的服务器开设出来的空间&#xff0c;其中windows server系统环境大多为win2008&…

编译程序基本原理的知识笔记

编译程序的作用是把某高级语言书写的源程序翻译成与之等价的目标程序。 1、编译过程 1.1 词法分析 编译过程的第一阶段主要任务是对源程序从前往后&#xff08;从左往右&#xff09;逐个字符扫描&#xff0c;从中识别出一个个单词符号。“单词”是程序设计语言的基本语法单位&a…