本章学习了图的结构及应用,
首先是图的分类,图分为无向图、有向图、完全图、连通图、强连通图、带权图、稀疏图、稠密图等等。
图的存储方式有两大类,以边集合方式的表示法和以链接方式的表示法。其中,以边集合方式表示的为邻接矩阵(借助二维数组来表示元素之间的关系,实现较为简单),以链接方式表示的包括邻接表、十字链表和邻接多重表(属于链式存储结构,实现较为复杂)。
接下来是图的遍历算法,图的遍历算法有两种,包括深度优先搜索遍历和广度优先搜索遍历。
深度优先搜索遍历类似于树的先序遍历,借助于栈结构来实现。
void DFS(Graph a,int b) //深度优先搜索 {visited[b]=true; //令顶点对应的visited数组为true,表示该顶点已被访问过 cout<<b<<" "; //输出顶点编号及空格 for(int i=0;i<a.vexnum;i++){if(a.arcs[b][i]==1 && visited[i]==false)DFS(a,i); //若顶点对应的邻接点未被访问,则递归调用DFS函数 }}
广度优先搜索遍历类似于树的层次遍历,借助队列结构来实现。
void BFS(Graph a,int b) //广度优先搜索 {int temp; //定义参数 while(!q.empty()) //若队列不为空 {temp=q.front(); //取队头元素值为temp q.pop(); //队头元素出队 cout<<temp<<" "; //输出temp值及空格 for(int i=0;i<a.vexnum;i++){if(a.arcs[temp][i]==1 && visited[i]==false) //若顶点对应的邻接点未被访问,则邻接点入队 {q.push(i); //邻接点入队 visited[i]=true; //邻接点对应的visited数组取true,表示已被访问 }}visited[b]=true; //第一次入队的顶点对应的visited数组值取true,表示已被访问 }}
然后是图的应用,比较常用的包括构造最小生成树算法、求解最短路径算法
构造最小生成树的算法有普里姆算法和克鲁卡斯算法,其中
普里姆算法的核心是归并点,时间复杂度是O(n2),适用于稠密网
克鲁斯卡尔算法是归并变,时间复杂度是O(elog2e),适用于稀疏网。
最短路径算法包括迪杰斯特拉算法和弗洛伊德算法,其中
迪杰斯拉特算法是求从某个源点到其余各顶点的最短路径,按路径长度递增的次序产生最短路径,时间复杂度为O(n2)
弗洛伊德算法是求每一对顶点之间的最短路径,时间复杂度为O(n3)
个人感觉图这一章概念很多,算法也很多,要多花时间看书,弄懂书上的概念和算法。