数据结构-第六章 学习小结

一、图的思维导图

二、学习心得

1、这一章图有好多基本术语,好容易混呐。在做个人作业时,题目说是判断两点间是否有边,当时我以为判断是否边就是判断路径(捂脸.jpg)。还是要多看看书,熟悉这些术语。

2、这一章有几个重要的算法—DFS、BFS、Prim算法、Kruskal算法、Dijkstra算法。一个一个学倒是清楚明白,但是一旦算法单独揪出来,我就不知道是哪个跟哪个了。说到底还是掌握不好。

3、最小生成树并不是唯一的,因为权值有可能是相同的;但若有算法的限制,最小生成树一定是唯一的。

4、我觉得用邻接表进行广度优先遍历有点像层序遍历,深度优先遍历像先序遍历。

三、几个重要算法

1、DFS算法(掌握!)——图的遍历

需要设置辅助标志数组visited[n],并初始化为“false”,一旦某个顶点被访问,则其相应的分量置为“true”。

void DFS(Graph G, int v)
{//从顶点v出发,深度优先搜索遍历连通图 G
    cout<< v;//访问第v个顶点
    visited[v] = true;//置访问标志数组相应的分量值为true
    for(w = firstAdjvex(G, v); w>=0; w = NextAdjVex(G,v,w))
        if(!visited[w]) DFS(G,w);// 对v的尚未访问的邻接顶点w递归调用DFS
 } 
连通图的DFS算法
//需要调用连通图的DFS算法
void DFST(Graph G)
{
    for (v=0; v<G.vexnum; v++)
        visited[v] = false;//初始化访问标志数组 

    for (v=0;v<G.vexnum;v++) 
        if(!visited[v]) DFS(G,v);//对还未访问的顶点调用DFS 
}
非连通图的DFS算法
采用邻接表表示图的DFS算法
void DFS_AM(AMGraph G, int v)
{
    cout << v ;//访问第v个顶点 
    visited[v] = true;//访问过则设为true 
    for(w=0; w<G.vexnum; w++)//依次检查邻接矩阵v所在的行
       if((G.arcs[v][w]!=0) && (!visited[w])) //如果w是v的邻接点且w未访问
           DFS_AM(G,w); //递归调用DFS_AM
}
采用邻接矩阵表示DFS算法

 

2、BFS算法——图的遍历

特点:要尽可能先对横向进行搜索

与DFS一样需要设置辅助标志数组visited[n],对数组的操作与DFS算法相同。BFS算法可以用队列作为辅助数据结构。

 

3、Prim算法(“加点法”)——最小生成树

掌握点:会看代码,根据算法操作填表。

需要附设一个辅助数据结构结构体数组closedge,记录从U到V-U具有最小权值的边。closedge数组包括两个域:lowcost(存储最小边的权值)和adjvex(存储最小边在U中的那个顶点)。

该算法的时间复杂度为O(n^2),与网中的边数无关,适用于求稠密网的最小生成树。

 

4、Kruskal算法(“加边法”)——最小生成树

掌握点:会看代码,根据算法操作填表。

需要附设一个辅助数据结构—结构体数组Edge,存储边的信息,结构体包括边的始点,边的终点,边上的权值;还要设置另一个辅助数组Vexset[i]来标识各个顶点所属的连通分量。

该算法的时间复杂度为O(e log2 e),其中e为网的边数,Kruskal算法与网中的边数无关,适用于求稀疏网的最小生成树。

 

5、Dijkstra算法——最短路径

按照路径长短递增的次序产生最短路径。

辅助数据结构数组:

S[n]:记录从源点到终点是否已被确定为最短路径

D[n]:记录从源点到终点的当前最短路径长度

Path[n]:记录从源点到终点的当前最短路径上相应顶点的直接前驱顶点序号

posted @ 2020-06-14 22:11  喂!包包  阅读(307)  评论(0编辑  收藏  举报