第六章学习小结
Posted xiedehan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章学习小结相关的知识,希望对你有一定的参考价值。
本章内容学习了图的结构及其应用,今天就学习的图的应用中的两种搜索方法“深度优先搜索”和”广度优先搜索“及对应的练习来给大家分享一下自己的心得。
题目如下:
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v?1?? v?2?? ... v?k?? }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。
输入样例:
8 6
0 7
0 1
2 0
4 1
2 4
3 5
输出样例:
{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
先分析一下这道题目,主要考察的是DFS算法和BFS算法的应用,再加上一些输出格式的控制,虽然两种算法不同,但核心都在于递归。DFS算法是通过顶点的邻接点代入函数递归,而BFS算法则有些不同,BFS算法是广度优先搜索,也就是先进行同一深度的搜索,再进行下一层次的搜索,这时我们便要用到一个结构—队列,通过队列的入队出队的方式,来完成广度优先搜索。
下面分享一下我的代码:
#include <iostream> #include <queue> using namespace std; typedef struct //定义图的结构 { int arcs[10][10]; //定义一个二维数组判断两个顶点之间是否连通 int vexnum,arcnum; //分别定义顶点数和边数 }Graph; bool visited[10]; //定义一个bool数组判断顶点是否已被访问 queue <int> q; //定义一个队列便于就行广度优先搜索 Graph Init_Graph(Graph a) //图的初始化 { int i,j,m,n; //定义参数 for(i=0;i<a.vexnum;i++) { visited[i]=false; //把bool类型的数组都初始化为false for(j=0;j<a.vexnum;j++) { a.arcs[i][j]=0; //把图的二维数组全部初始化为0 } } cin>>a.vexnum>>a.arcnum; // 分别输入顶点数以及边数 for(i=0;i<a.arcnum;i++) { cin>>m>>n; //分别输入两个顶点的编号 a.arcs[m][n]=1; a.arcs[n][m]=1; //令两个顶点对应的两个二维数组的值为1 } return a; //返回图 } 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,表示已被访问 } } int main() { Graph a; //定义一个图 a=Init_Graph(a); //初始化图 int i; //定义参数 for(i=0;i<a.vexnum;i++) { if(visited[i]==false) //若有顶点未被访问,则循环调用DFS函数 { cout<<"{ "; //控制输出格式 DFS(a,i); cout<<"}"<<endl; //控制输出格式 } } for(i=0;i<a.vexnum;i++)visited[i]=false; //把visited数组初始化为false for(i=0;i<a.vexnum;i++) //若有顶点未被访问,则循环调用BFS函数 { if(visited[i]==false) { q.push(i); //未被访问的顶点入队 cout<<"{ "; //控制输出格式 BFS(a,i); cout<<"}"<<endl; //控制输出格式 } } return 0; }
这些搜索方法只是图的应用的一小部分,课本中还有很多关于图的应用等待着我们去学习,图在数据结构中算是一种比较重要的结构类型,在应用方面也十分广泛,希望接下来几周好好学习!
以上是关于第六章学习小结的主要内容,如果未能解决你的问题,请参考以下文章