标签:广度优先搜索 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