一、图的思维导图
二、学习心得
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算法 void DFST(Graph G) { for (v=0; v) visited[v] = false;//初始化访问标志数组 for (v=0;v ) if(!visited[v]) DFS(G,v);//对还未访问的顶点调用DFS }


void DFS_AM(AMGraph G, int v) { cout << v ;//访问第v个顶点 visited[v] = true;//访问过则设为true for(w=0; w//依次检查邻接矩阵v所在的行 if((G.arcs[v][w]!=0) && (!visited[w])) //如果w是v的邻接点且w未访问 DFS_AM(G,w); //递归调用DFS_AM }
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]:记录从源点到终点的当前最短路径上相应顶点的直接前驱顶点序号