第六章学习小结
一、内容小结
与图相关的概念和术语比较多,比如:无向图&有向图、简单图&多重图、连通&强连通、无向&有向完全图等;还特别容易搞混各个字符的含义,需要多注意;算法也不是很好理解,好在这学期还不打算深入图的学习。
#define MaxInt 32767 //表示极大值, 即 OO #define MVNum 100 //最大顶点数 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 typedef struct { VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum, arcnum; //图的当前点数和边数 }AMGraph;
#define MVNum 100 //最大顶点数 typedef char VertexType; typedef struct ArcNode //边结点 { int adjvex; //该边所指向的顶点的位置 struct ArcNode *nextarc; //指向下一条边的指针 OtherInfo info; //和边相关的信息 }ArcNode; typedef struct VNode //顶点信息 { VerTexType data; ArcNode *firstarc; //指向第一条依附该顶点的边的指针 } VNode, AdjList[MVNum]; //AdjList表示邻接表类型 typedef struct //邻接表 { AdjList vertices; int vexnum, arcnum; //图的当前顶点数和边数 }ALGraph;
图的两种算法:DFS、BFS
void DFS_AM (AMGraph G, int v) {//图G为邻接矩阵类型,从第v个顶点出发深度优先搜索遍历图G cout << v; visited[v] = 1; //访问第v个顶点,并置访问标志数组相应分量值为1 for(int w=0; w<G.vexnum; w++) //依次检查邻接矩阵v所在的行 if((G.arcs[v][w] != 0)&& (!visited[w])) DFS_AM(G,w); //G.arcs[v][w]!=0表示w是v的邻接点,如果w未访问,则递归调用DFS_AM }
//采用邻接表表示图的深度优先搜索遍历DFS void DFS_ AL (ALGraph G, int v) {//图G为邻接表类型,从第v个顶点出发深度优先搜索遍历图G cout << v; visited[v] = 1; //访问第v个顶点,并置访问标志数组相应分量值为1 int p = G.vertices[v].firstarc; //p指向v的边链表的第一个边结点 while (p!=NULL) {//边结点非空 w = p->adjvex;//表示w是v的邻接点 if(!visited[w]) DFS(G, w);//如果w未访问,则递归调用DFS p = p->nextarc;//p指向下一个边结点 } }
void BFS_AM(AMGraph G, int v) {//按广度优先非递归遍历连通图G visited_BFS[v] = 1; queue<int> Q; Q.push(v);//v进队 while(Q.size() != 0) //队列非空 { int front = Q.front(); Q.pop(); //队头元素出队 cout << front << " "; for(int i=0; i<G.vexnum; i++) { if(G.arcs[i][front] == 1 && visited_BFS[i] == 0) { visited_BFS[i] = 1; Q.push(i); } } } }
BFS_AL最小生成树(Prim算法、Kruskal算法)、最短路径(Dijkstra算法、Floyd算法)、拓扑排序、关键路径,前面两个课堂上老师讲完后理解起来容易些,后两个看视频看书还是有点懵,大概懂了思路,算法略微吃力。
二、注意点
1、关于动态非配的数组与静态数组的初始化
如果这样初始化,是错的:
bool *check = new bool[n+1]{false}; //只初始化了check[0]
应改为 bool *check = new bool[n+1](0); //申请动态空间并初始化
如果这样初始化,是对的:
bool check[100001] = {false}; //没有被显式初始化的元素,被初始化为相应类型的默认值。
2、使用邻接矩阵a存储无向网络,若i号顶点与j号顶点之间不存在边,则a[i][j]值为多少,你是怎么分析的?
参考(1):若权值是一个正整数,可以设为0或负数。若权值是整数,则设为一个大于所有边权值的数。(不只是无穷)
参考(2): a[i][j]=无穷(也指代计算机允许的、大于所有边上权值的数),在邻接矩阵存储无向网络的时候,初始的时候先将每个顶点即每一行的权值都初始化为无穷。在输入数据的时候,再根据给定的权值,对二维数组对应的空间进行值替换,此时显示的值即为新的权值。不存在边的话,在我们遍历的时候,得到的就是无穷了。
3、对于连通图,其连通分量就是它本身(做题时注意看清前提)。
4、实践题的距离计算函数一开始没想好写得比较绕,还有的是要用辅助数组和定义全局变量,这两个要学起来。

浙公网安备 33010602011771号