您的位置:首页 > 其它

2016-03-23 12:48 1131 查看
一、图的定义和术语

1、完全图:当有n个顶点,e条边时,e=n*(n-1)/2时为完全图

2、有向完全图、稀疏图、稠密图

3、度:与顶点相连的边的数目。也有入度、出度

4、连通图:任意两个顶点都相通。

5、连通图生成树:连通图的极小连通子图生成的树。任意增加一边都会出现回路

6、强连通:在有向图中任意两个顶点相通

 

二、图的存储

1、邻接矩阵

   一般采用二维数组进行存储

2、邻接表

       对每个顶点都建立一个单链表。每个表中的节点由与该顶点相关联的节点组成。节点结构有三个域:邻接点、权值、下一条边的指针

 

三、图的遍历

   一般增加一个标志数组用于记录该节点是否被访问过

1、DFS

  当访问到某个顶点时,递归访问所有未访问的相邻节点。实际就是沿着图的某一分支进行搜索,直至末端,再回朔,沿另一分支进行搜索

2、BFS

      类似于层次遍历,访问某个节点V时,依次访问所有与V相邻的节点,完了再从这些几点出发,再访问。

      使用时用队列存储访问的节点。

 

四、最小代价生成树

1、定义

   A 最小代价生成树的边数等于顶点个数-1,且是连通的

   B 最小代价生成树的边的权值之和最小

2、prim算法(适用于稠密)

       首先定义一个集合U,里面存放最小代价生成树的节点。初始化里面只放V0。接着从剩余的所有边中,选择U那一坨和剩下那坨连接的权值最小的边,把那个点加入U,继续循环,直至全部都在U里

3、Kruskal算法(适用于稀疏)

        首先所有的点都是一个个独立的树。从可用边中选择一个当前权值最小的边,若那个边连接了两个不同的树,那么就用这个边,那两个子树也就合为一个树了。继续循环。

        对于边的权的顺序处理,可以首先对边权进行排序,然后判断是否在一个树中。

        对于判断是否在一个树中的处理,可以用数组做一个特殊的标记标记不同的树。首先每个树的标记不同。T[i]表示i节点所属的树,若两个T[I]==T[J],则两个属于同一个子树

 

五、有向无环图的应用(DAG)

     1、判断一个图是否为无环

        可以用拓扑排序,可以用DFS。当访问到一个已经访问过的节点时,就发生了回环

2、拓扑排序

  应用的场景就是课A是课B的先行课,这样排序,看课是怎么上。

排序方法:在图中任意选择一个没有前驱的顶点输出,再删除该节点和他的所有边。再重复操作。

  因此排序不唯一

3、关键路径(AOE)

      应用场景就是一个工程施工,有多个子单位,多个子单位可以并发进行。看最短什么时候能完成施工,减少那个工程的时间就可以减少整体的时间。

      实际就是从起点到终点的最长路径。

      计算方法:按拓扑排序,算出每个顶点最早发生的时间,存与A[]。按逆拓扑排序,计算每个顶点最迟 发生的时间,放于B[].若A[i]=B[i],则那个点为关键活动,位于关键路径

 

六、最短路径

应用场景就是从点A到点B,若存在多条路径,求最短花费的路径

1、起点给定——Dijstra算法

       思想就是首先初始化一个集合U,存放最短路径。开始里面为源点V0。然后遍历邻点。若存在,则判断是他们两点之间的直线权值最小,还是经过U里的点中转之后权值更小,选最小的,然后进行存储。

2、所有顶点之间的最短路径——Floyd算法

      不常用,就不说了   

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: