第六章学习小结
这一章学习了图的定义、基本术语、存储结构、遍历,以及最小生成树、最短路径等
图的存储结构是这一章的基础,主要学了邻接矩阵和邻接表
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算法,过程和最小生成树有点相似,刚开始学的时候不是很懂,之后重新看才理解
这一章的内容比前面更难了,内容更多更复杂,也更难理解
特别是最小生成树和最短路径的算法在学习的时候很容易搞混,一星期学了三种算法后感觉有点混乱,接下来会找时间把这几个算法再画图梳理一遍
还有一些细节上的问题,比如测验的搜索顺序,这种问题以后会多注意
马上就期末了,接下来要抓紧时间学习了