第六章 图 学习小结

第六章知识点总结

 

图是由一个顶点集V和一个边集E构成的数据结构。   

 

图的基于邻接矩阵的结构定义

1 //用两个数组分别存储顶点表和邻接矩阵
2 const int MVNum = 100;      //最大顶点数 
3 typedef char VerTexType; /假设顶点的数据类型为字符型 
4 typedef int ArcType;        //假设边的权值类型为整型 
5 typedef struct{ 
6   VerTexType vexs[MVNum];    //顶点表 
7   ArcType arcs[MVNum][MVNum]; //邻接矩阵 
8   int vexnum,arcnum;          //图的当前点数和边数 
9 }AMGraph; 
图的基于邻接矩阵的结构定义

 

 

邻接矩阵与邻接表表示法的关系

 

 

 

邻接表中顶点的结构:

 

1 typedef struct { 
2   VerTexType  data;   // 顶点信息
3   ArcNode  *firstarc; 
4        // 指向第一条依附该顶点的弧
5   } VNode, AdjList[MVNUM];
邻接表中顶点的结构

 

邻接表中邻接点的结构

 

1 typedef struct ArcNode {  
2   int adjvex;   //该边所指向的顶点的位置
3   struct ArcNode *nextarc; //指向下一条边的指针
4   OtherInfo info;   //和边相关的信息,例如权值
5 } ArcNode
邻接表中邻接点的结构

 

 

图的基于邻接表的结构定义

 

1 typedef struct {  
2      AdjList  vertices;
3      int  vexnum, arcnum;                                      
4                   //顶点数和边数 
5 } ALGraph
图的基于邻接表的结构定义

 

图的遍历:

(也是一种递归调用)

1:深度优先搜索:(DFS)

即先纵向访问,访问到底了再回来

2:广度优先搜索:(BFS)

即横先搜索,搜索完一层再到下一层,不会往回走。

 

顶点a出发的深度优先遍历顺序(不唯一):

    a b c f e d

顶点a出发的广度优先遍历顺序(不唯一):

a b e d c f

 

 

图的应用:

最小生成树:

1:普里姆算法:(选顶点)(适合稠密网)

我的理解:选一个顶点,然后在它的邻接顶点中选择权值最小的,做下一个顶点,直到下一个顶点是被选过的,然后沿原路返回,继续寻找没访问过的权值最小的顶点,直到全部顶点被访问完。

 

2:克鲁斯卡尔算法:(选边)(适合稀疏网)

(1)     先把权值从小到大排列

(2)     每个顶点自成一个联通分量,成一个集合T

(3)     选择两个权值最小的联通分量,若他们不形成回路,则结合成新的联通分量,删了结合前的,把结合后的加入集合T

(4)     直到所有顶点都在一条联通分量上即结束。

 

本周反思:对于关于图的应用,基本定义能理解,但是对于代码如何实现算法思想还不是很理解,应用在具体问题还是有点难度,PTA的作业还没写完,希望下周能熟练应用图的方法思想去解题。

 

posted @ 2019-05-19 23:35  Y000  阅读(142)  评论(1编辑  收藏  举报