第六章学习小结
第六章学习小结
上周,我们学习了图的相关内容,图的内容很多,所以我将它又重新理顺了一遍,因为是在笔记本上写的,导出来就变成一张图了
PTA题目:列出连通集
给定一个有1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照 “ { v1, v2, v3, ... ,vk } ”的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。
1 v2 ... vk }"的格式,每行输出一个连通集。先输出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 }
1 #include <iostream> 2 #include <queue> 3 #include <cstdio> 4 using namespace std; 5 6 typedef struct{ 7 int arcs[10][10]; 8 int vexnum,arcnum; 9 }Graph; 10 11 bool visited[10];//定义数组判断顶点是否已被访问 12 queue <int> q; 13 14 Graph Init_Graph(Graph a){//初始化t图 15 int i,j,m,n; 16 for(i=0;i<a.vexnum;i++){ 17 visited[i]=false;//把bool类型的数组都初始化为false,用于判断是否被访问 18 for(j=0;j<a.vexnum;j++){ 19 a.arcs[i][j]=0;//把图的二维数组全部初始化为0 20 } 21 } 22 cin>>a.vexnum>>a.arcnum; 23 for(i=0;i<a.arcnum;i++){ 24 cin>>m>>n; 25 a.arcs[m][n]=1; 26 a.arcs[n][m]=1;//使对应的两个二维数组的值为1 27 } 28 return a; 29 } 30 31 void DFS(Graph a,int b)//深搜 32 { 33 visited[b]=true;//使顶点对应的visited数组为true,表示顶点已被访问过 34 cout<<b<<" "; 35 for(int i=0;i<a.vexnum;i++){ 36 if(a.arcs[b][i]==1 && visited[i]==false)DFS(a,i);//若顶点对应的邻接点未被访问,则递归调用DFS函数 37 } 38 } 39 40 void BFS(Graph a,int b){ //广搜 41 int temp; 42 while(!q.empty()){ 43 temp=q.front(); 44 q.pop(); 45 cout<<temp<<" "; 46 for(int i=0;i<a.vexnum;i++){ 47 if(a.arcs[temp][i]==1 && visited[i]==false){//若顶点对应的邻接点未被访问,邻接点入队 48 q.push(i); 49 visited[i]=true;//邻接点对应的visited数组取true,表示已被访问 50 } 51 } 52 visited[b]=true;//第一次入队的顶点对应的visited数组值取true,表示已被访问 53 } 54 } 55 56 int main(){ 57 Graph a; 58 a=Init_Graph(a); 59 int i; 60 for(i=0;i<a.vexnum;i++){ 61 if(visited[i]==false){//若有顶点未被访问,则循环调用DFS函数 62 cout<<"{ "; 63 DFS(a,i); 64 cout<<"}"<<endl; 65 } 66 } 67 for(i=0;i<a.vexnum;i++)visited[i]=false;//把visited数组初始化为false 68 for(i=0;i<a.vexnum;i++){//若有顶点未被访问,则循环调用BFS函数 69 if(visited[i]==false){ 70 q.push(i); 71 cout<<"{ "; 72 BFS(a,i); 73 cout<<"}"<<endl; 74 } 75 } 76 return 0; 77 }
本周学习遇到了很多困难,但是在同学的帮助下和查阅资料的过程中明白了很多,最终成功解决了问题。下一章继续努力!
从题目不难看出,主要做的两个方向:构造图,应用DFS,BFS算法。