第6章学习心得

第六章学习了图

一、图的储存方式——邻接矩阵、邻接表、十字链表和邻接多重表

1、邻接矩阵是表示顶点之间相邻关系的矩阵

2、邻接表是图的一种链式存储结构,邻接表由表头结点表(数据域和链域)和边表(邻接点域、数据域和链域)

typedef struct ArcNode
{// 边结点
   int adjvex;
   struct ArcNode *nextarc;
   OtherInfo info;
}ArcNode;

typedef struct Vnode
{// 顶点信息
   VerTexType data;
   ArcNode *firstarc;
}Vnode,AdjList[max];

typedef struct
{// 邻接表
   AdjList verices;
   int vexnum,arcnum;
}ALGraph;

3、十字链表:有向图的邻接表和逆邻接表结合起来的一种链表

4、邻接多重表:无向图的另一种链式存储结构

二、图的遍历——深度优先和广度优先

 

 

1、深度优先(DFS)类似于树的先序遍历

邻接矩阵的深度优先

void DFS_AM(AMGraph G,int v) 
{  //图G为邻接矩阵类型,从第v个顶点出发深度优先搜索遍历图G
cout<<v;visited[v]=true; //访问第v个顶点,并置访问标志数组相应分址值为true
for(w=O;w<G.vexnum;w++) 
//依次检查邻接矩阵 v所在的行

if((G.arcs[v] [w] !=O}&&(!visited[w]}} DFS(G,w}; 

//G.arcs[v] [w] ! =0  表示w是v的邻接点, 如果w未访问, 则递归调用DFS
}

 

邻接链表的深度优先

void DFS_AL (ALGraph G,int v) 
{//图G为邻接表类型, 从第v个顶点出发深度优先搜索遍历图G

cout<<v;visited[v]=true; //访问第v个顶点,并置访问标志数组相应分量值为true
p=G.vertices[v] .firstarc; //p指向v的边链表的第一个边结点
while(p!=NULL) //边结点非空
  {
      w=p->adjvex;//表示w是v的邻接点
       if(!visited[w]) DFS(G,w); //如果w未访问, 则递归调用DFS
       p=p->nextarc; //p指向下一个边结点
   }
}

2、广度优先(BFS)——类似于树的按层次遍历,尽可能先对横向进行搜索

三、图的应用

主要的是:最小生成树(在一个连通网的所有生成树中,各边的代价和最小的那棵树成为最小生成树)

普里姆算法(Prjm算法):“加点法”(逐步增加U中的顶点)

克鲁斯卡尔算法(Kruskal算法):“加边法”(逐步增加生成树的边)

** 要求能够看懂代码

还有  最短路径--从源点到其余各顶点的最短路径

迪杰斯特拉算法(按照路径长短递增的次序产生最短路径)

四、总结

虽然这一章的内容比较少,知识点也是不怎么多,大部分也容易理解,但是实际上要实现代码的话还是很难的。对于图,包括它的存储,遍历,应用,在代码方面还是比前面学的树、线性表更为复杂。在图中任意两个结点的关系都是有可能相关的,两个结点之间的边有可能是空,有可能是有向、无向,图又能根据边或弧的多少分为稀疏图和稠密图。

这几次上课都有好好地总结笔记,看代码,希望自己下一阶段也能保持这种认真的态度,加油!!!

 

posted @ 2020-06-14 22:10  不正经随记  阅读(251)  评论(0编辑  收藏  举报