码迷,mamicode.com
首页 > 其他好文 > 详细

第六章学习小结

时间:2020-06-14 23:53:07      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:广度优先搜索   close   算法   连通图   kruskal   深度   init   理解   多源   

1,学习内容小结:

图:(1)存储结构: 邻接矩阵 :适用于稀疏图,顶点较多

                               &   邻接表    :适用于稠密图,顶点较少或无需记录权值

       (2)遍历:深度优先搜索(DFS):类似先序遍历

                           广度优先搜索(BFS) :类似层次遍历

       (3)应用:<1>最小生成树(不是唯一的,但权值一定是一样的;若由程序得出则一定唯一):

                                                Prime  算法:从任意顶点开始,选择与之相邻的最小边,将另一端的顶点加入,再选现有顶点集相邻的最小边

                                                Kruskal 算法:先选剩余中最小的边,再看是否已包含所有的顶点,即n个顶点,是否有n-1条边

                                                Dijkstra:与Prim算法有一定相似,选择一点作为源点,按各顶点与源点最短路径长度递增的顺序,除去在V集合中的,把剩下的当中路径最短的选进去,直到所有的点在V中

                                 

           !!!注意   :1.Prim,Kruska用于求最小生成树,即树的权值和最小;Dijkstra求单源最短路径,即源点到各点最短的路径

                         2.Prim算法与Dijkstra算法方法类似,但有区别。Prim中的最小权值边是基于整个顶点集的,而Dijkstra的最小权值边是基于源点,新加入的点只是作为中转点。

                           Prim算法的辅助数据结构closedge[]在更新时,更新到邻接点;而Dijkstra算法的辅助数据结构D[]更新到源点,要求和。  !!!                                    (这是我看到的好的总结,在此引用学习)

                           <2>最短路径: 单源最短问题

                                                    多源最短问题

 

 

      代码:      

 

                                      

bool visited[MVNum]; //访问标志数组, 其初值为"false"
//连通图
void DFS(Graph G, int v)
{
cout<<v; visited[v]=true;
//访问第v个顶点,并置访问标志数组相应分扯值为true
for(w=FirstAdjVex(G,v); w>=O; w=NextAdjVex(G,v,w))
//依次检查v的所有邻接点w,FirstAdjVex(G,v)表示v的第一个邻接点
//NextAdjVex(G,v,w)表示v相对于w的下一个邻接点,w≧0表示存在邻接点
if(!visited[w]) DFS(G,w);
//对v的尚未访问的邻接顶点w递归调用 DFS
}
//非连通图
void DFSTraverse(Graph G)
{
for(v=0; v<G.vexnum; ++v)
visited[v]=false; //访问标志数组初始化
for(v=0; v<G.vexnum; ++v) //循环调用算法6.3
if(!visited[v]) DFS(G, v); //对尚未访问的顶点调用DFS
}

 

 

void BFS{Graph G, int v) //连通图
{
cout<<v;
visited[v]=true;
InitQueue(Q); //辅助队列Q初始化,置空
EnQueue(Q, v); //v进队
while(!QueueEmpty(Q)) //队列非空
{
DeQueue(Q, u); //队头元素出队并置为u
for(w=FirstAdjVex(G,u); w>=O; w=NextAdjVex(G,u,w))
//依次检查u的所有邻接点w, FirstAdjVex(G,u)表示u的第一个邻接点
//NextAdjVex(G,u,w)表示u相对于w的下一个临界点,w≧0表示存在邻接点
if(!visited[w]) //w为u的尚未访问的邻接顶点
{
cout<<w;
visited[w]=true;
EnQueue(Q, w); //w进队
} //if
} //while
}

 

 

2,学习心得:来到“图”这一章节,算法更复杂了,对于同一问题有不同的算法来求解。就理解来说还行,但是涉及到代码就容易出错了,需仔细。本章对代码要求不高,那么就要花心思在理解看懂代码了,注意题目设计的坑,有图有真相。

3.下一目标:跟随老师脚步学会算法分析,加强编程

第六章学习小结

标签:广度优先搜索   close   算法   连通图   kruskal   深度   init   理解   多源   

原文地址:https://www.cnblogs.com/txh-001/p/13127497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!