第六章学习小结

这一章学习了图的定义、基本术语、存储结构、遍历,以及最小生成树、最短路径等

图的存储结构是这一章的基础,主要学了邻接矩阵和邻接表

 1 //邻接矩阵
 2 typedef struct
 3 {
 4     VerTexType vexs[MAX];
 5     ArcType arcs[MAX][MAX];
 6     int vexnum, arcnum;
 7 }AMGraph;
 8 
 9 //邻接表
10 typedef struct ArcNode
11 {
12     int adjvex;
13     struct ArcNode *next;
14     OtherInfo info;
15 }ArcNode;
16 typedef struct VNode
17 {
18     VerTexType data;
19     ArcNode *first;
20 }VNode, AdjList[MAX];
21 typedef struct
22 {
23     AdjList Vertices;
24     int vexnum, arcnum;
25 }ALGraph;

 

这两种形式在有向图和无向图中各具优缺点,要根据不同情况选择

 

图的遍历是一大重点,主要分为深度优先搜索和广度优先搜索

 

 

 

 

 1 void DFS(graph& g, int v)//深度优先
 2 {
 3     cout << v << " ";
 4     visited[v] = true;
 5     for (int i = 0; i < g.vexnum; i++)
 6     {
 7         if (visited[i] == false && g.arcs[v][i] == 1) DFS(g, i);
 8     }
 9 }
10 
11 void BFS(graph& g, int v)//广度优先
12 {
13     cout << v << " ";
14     visited[v] = true;
15     queue<int> q;
16     q.push(v);
17     while (!q.empty())
18     {
19         int k = q.front();
20         q.pop();
21         for(int i=0; i<g.vexnum; i++)
22             if (visited[i] == false && g.arcs[k][i] == 1)
23             {
24                 cout << i << " ";
25                 visited[i] = true;
26                 q.push(i);
27             }
28     }
29 }

这两种遍历方法也是在不同情况下各有优势,但我感觉DFS的代码比较容易理解,BFS比较难看懂

在搜索的时候还要注意i的值,看好搜索顺序,这周的课堂测验就踩坑了,以后会注意这点

 

最小生成树和最短路径是这一章最难和最容易搞混的

最小生成树主要有普里姆算法和克鲁斯卡尔算法

普利姆算法是基于点来生成,克鲁斯卡尔是根据边来生成

 

 

 

 求最短路径主要是用Dijkstra算法,过程和最小生成树有点相似,刚开始学的时候不是很懂,之后重新看才理解

 

 

 

这一章的内容比前面更难了,内容更多更复杂,也更难理解

特别是最小生成树和最短路径的算法在学习的时候很容易搞混,一星期学了三种算法后感觉有点混乱,接下来会找时间把这几个算法再画图梳理一遍

还有一些细节上的问题,比如测验的搜索顺序,这种问题以后会多注意

马上就期末了,接下来要抓紧时间学习了

 

posted @ 2020-06-14 18:22  1907陈航  阅读(278)  评论(0编辑  收藏  举报