图论

图论:

<绪论>

1 运用图论有很多处理社会上的事情。比如:交通网,电信网,供水网,互联网等。

2 图分为四种:

1 无向图

2 有向图

3 无向带权图

4 有向带权图

3 其中最主要的算法是遍历算法:包括广度算法,深度算法。

4 研究方向还是从逻辑结构,存储结构还有数据算法运算。

5 定义:顶点,边。

比如:v = {1,2,3,4,5}   一个编号对应一个唯一的顶点。

          G={(1,2),(1,3),(2,3),(2,4).....}   连接两个不同顶点的边的有限集合。

即逻辑结构是多对多。

6 无向图:(  i  ,  j  )  ij   或是  jj.

7 有向图:(  i  ,  j  )  ij   

8 重中之重:每个元素有0个前驱或多个前驱,每个元素也可以0个后继或多个后继。

<>基本术语:

1 无向图:顶点,边(我不多解释,你懂得)

2 有向图:顶点:对于<i,   j>来说i是起点,j是终点。

          边:< i j>对于这个来说,从i出发的是一条出边,从j进入的是一条入边。

3 度数:一个顶点到所有边的数目。

4 出度与入度:对于有向图来说,出度就是从一个点指向另一个点的边数,而入度就是进入这个点的变得数目,所以在有向图里你懂得:出度加入度就是有向图的度。

5 度数/2就是这个图的边数。

6 完全图:

1 无向图:每两个顶点之间就存在一个边。(一个边)共n(n-1)/2条边。

2 有向图:每两个顶点之间存在两个边(出边与入边)。(两个边)共n(n-1)条边。

7 稠密图:当一个图完全接近于完全图时。

8 稀疏图:当一个图远小于完全图。

9 子图:你懂得。

10 路径与路径长度:

1 无向:顶点ij的序列。比如(i1,i2),(i2,i3),(i3,i4),(i4,i5).......

2 简单路径:除开始点和结束点可以相同,其余点都不同的序列就是简单路径。

3 回路或环:开始点与结束点为同一顶点。

4 简单回路:开始点和结束点相同的简单路径。

11 连通:

 无向图:顶点i与顶点j有路径,则二者是连通的。

 连通图:任意两个顶点都连通,则为连通图,否则为非连通图。

 连通分量:极大连通子图。

 任何连通图都只有一个连通分量。

 非连通图有多个连通分量。

有向图:顶点i到顶点j有路径。则为连通的。

 强连通图:任意两个顶点ij都连通,那么该图为连通图。

强连通分量:你懂得。

 

12 权:图中每一个边上都有一个数值,这个数值就是权

13 权有可能是一个顶点到另一个顶点的距离,也有可能是花费代价。

14 网:边上带权的图。

 

<图的邻接矩阵存储结构,图的邻接表存储结构>

1 首先来看邻接矩阵存储结构:

1 二维矩阵:

比如: 0 1 1 无穷

           1    0   1   0

           无穷    1   0   1

           1    无穷   0   0

其中1代表 有相邻的边

0      指向自身

无穷   指不到所指的那条边

其中无向图是对称矩阵:因为ab,b也到a.

有向图不可能是对称矩阵:因为ab,但是b不一定到a.

无向图的度:第i行或第i列是为1的元素。

有向图的度:第i行与第i列的1的数目之和。(出度+入度)。

数据类型定义:自己看书。

2 邻接表:

邻接表分为两部分,一个是顶点,另一个是边。

表头节点包括两个部分,一个是头,另一个是指针,(头是信息吧,预估)。

边表节点,包括三个部分,一个是id,一个是权值,另一个是地址,指向下一个节点。

顺序与链式相结合:在表头的地方,可以使用顺序表,

                      在表的边节点上,可以使用链表。

<第三个重点>:图的遍历:(这里先都以邻接表为例)

1 遍历可以分为两种:广度遍历算法BFSbreadth first search)与深度遍历算法DFS(deep first search)

2 遍历策略:

1 DFS:在树里我们就用过,比如先序算法。

2 BFS:在树里我们也用过,比如层次遍历算法。

3 DFS:

1 访问初始点:顶点。

2 选择与顶点相邻却没有被访问过的为下一个顶点。

3 直到所有的都被访问。

注:递归可以相当于回退。

重中之重:相邻的中,或许有的已经作为其他顶点的邻接点被访问了,但是由于遍历,另外一个顶点还是有可能碰到他,那么如何判断他到底被访问过还是没有?

答:可以用一个数组:这个数组里面存放的是从1开始的id编号值得状态值:其中编号为1的已经被访问过,编号为0的是还没有被访问。由此来判断。

 

 

4 BFS:

1 访问顶点

2 访问顶点的所有邻接点。

3 都访问完了,在去掉第一个点,在访问第二个邻接点的所有邻接点。

注:队列可做删除的用处。

 

5 非连通图的遍历:

说明:虽然是非连通图(即可能有两个连通分量或是更多,但是在邻接表里都会去表示,而表示出来的效果是前几个顶点的边节点所代表的id值与后面的节点的id值脱节)。

算法我就不写了,完了自己写。

 

6 生成树:

顾名思义:生成树就是由图变为树。图生成的树边是(n-1),即图的顶点比如是5,那么生成的树必须有4条边。

因此,会有两个特点。

<特点一>:如果再多一条边,那么构成环。

<特点二>:如果再少一条边,那么非连通。

7 最小生成树:即生成的树带权:这样就有大小之别,比如路程最短,又比如费用最少。

定义:图的所有生成树中,把权值相加所得之和的最小值所指向的树为最小生成树。

8 最小生成树的prime算法。

点睛之笔:需要两个数组:lowcost[]  closest[]

9 最小生成树的kruskal算法。

 

posted @ 2017-05-07 16:30  freebirds  阅读(442)  评论(0)    收藏  举报