图(我是真的胡图图呀)

思维导图:

图的一些基本概念 

以下图来自b站《王道计算机考研 数据结构》

图(我是真的胡图图呀)_第1张图片

 

 

 生成子图:就是原图里面有的顶点,子图里面都有,那就说明这个子图就是生成子图(无向图也是一样的)

 图(我是真的胡图图呀)_第2张图片

 

这个例子举得很好:什么叫极大连通分量,各个顶点之间能连上的都已经连上了,像上面的这个图就很好的说明了问题,由于中国大陆里面的铁路已经完全连上了,所以珠三角地区的铁路并不能算连通分量,而海南和台湾由于和大陆相隔,所以他们在内部就算一个连通分量 

如图:ABCDE都已经链接起来,可以通过这五个点中任意一个点到达任意一个点,而F只能是F到B,而B却不能F所以不是相互连通(即强连通),F不能和ABCDE构成一个强连通分量 。

 有n个点,然后有n-1条边,判断是否为生成树的方法就是看这个图中是否构成了回路(就是看是否构成了环,圈圈)

图(我是真的胡图图呀)_第3张图片

将图的连通分量都改为生成树,那么就形成了连通森林, 

图(我是真的胡图图呀)_第4张图片 图(我是真的胡图图呀)_第5张图片

 树是极小的连通图,也是极大的无环图。少一条边就会不连通,多一条边就会出现环

图的存储方式

邻接矩阵法

在里面第一个字符型数组是用来存放ABCD等,这写字符的下标也是有讲究的,对应着这个字符的行和列。如A对应得就是下标为0,那么在二维数组中它就是第0行和第0列。

bool类型还有一个好处就是他的字节更小,0和1占4个字节,而false和true只占1个字节,当你想用一个二维数组来存放一个有关方向或者是关系的时候往往这个数组需要开的很大,所以这个时候就可以考虑一下使用bool类型的二维数组 

 

由于二维数组里米娜可以确定那两个点之间有边,所以可以通过给相应的格子中赋值来表示变得权重。INFINITY表示int 类型的最大值

 图(我是真的胡图图呀)_第6张图片

这个性质是用于判断路径长度的个数,看图:A到B 长度为1的路径有几条?答案就是一条。(注意这里只适合元素为01的矩阵)

邻接表法

图(我是真的胡图图呀)_第7张图片

顺序存储各个节点,每个节点中保存孩子链表头指针 

 

 顺序表中存储的是每一个顶点的位置,这个顶点一共有三个元素,第一是用于存放数据,第二是用于入度的指针(也就是绿色的区域),第三个元素就是出度的指针(也就是橙色的区域)。
而弧节点的橙色代表着链表中的某一环,如果橙色为空则代表着入度的指针已经全部找完了,同理如果弧节点的绿色最后指向的是空则代表着出度的点已经全部找完了(我说的这个绿色和橙色是嗲表hlink和thlink这两部分的指针)。其中弧节点中的弧尾顶点编号和弧头顶点编号应该不是指针,是一个整形变量,从绿色到橙色就代表这指向。

图(我是真的胡图图呀)_第8张图片太抽象了 这个十字链表法和邻接多重表法太抽象了。 

图(我是真的胡图图呀)_第9张图片

 bfs和dfs有关在图上的运用图(我是真的胡图图呀)_第10张图片

最小生成树

 图(我是真的胡图图呀)_第11张图片

最小生成树就是使只修一条路是的修这这条路的所用的开销最小 如上图右边的代价要比左边的底,所以我们选择右边的这种建造方式

图(我是真的胡图图呀)_第12张图片

如想要构建最小生成树,可以使用以上两种算法。 

你可能感兴趣的:(算法)