一、谈谈你对本章的学习心得,或者任选本章一道题目,谈谈你解决该题的心得体会
图的存储结构,当下我们应当掌握得很透彻的,有两种,邻接矩阵和邻接表,
关于图的遍历方式,也有两种,深度优先搜索(DFS)和广度优先搜索(BFS)。
然后,PTA上 第7章作业7-1 列出连通集 很好的考察了DFS和BFS的具体实现。
首先是题目要求:
因为题目中有个比较坑的要求,
所以我推荐用邻接矩阵的存储结构去创建图。(如果用邻接表去整,还要将邻接表中的邻接点域按从小到大排,麻烦)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 typedef struct 2 { 3 int **matrix;//邻接矩阵 4 int vexnum,arcnum;//顶点和边数 5 }Graph; 6 7 8 void CreateUDG(Graph &G);//创建无向图 9 void DFS(Graph G, int k);//深搜 10 void BFS(Graph G, int k);//广搜 11 void find(Graph G);//依次输出连通集,先DFS后BFS 12 13 14 bool v[100];
这是写代码前要想好的需要些什么结构体、函数、变量。
然后主函数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int main() 2 { 3 Graph G; 4 CreateUDG(G); 5 6 7 find(G); 8 return 0; 9 }
然后各个函数的具体代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 void CreateUDG(Graph &G)//创建无向图 2 { 3 cin>>G.vexnum>>G.arcnum;//输入顶点数和边数 4 5 6 G.matrix=new int*[G.vexnum];//动态创建邻接矩阵 7 for(int i=0; i<G.vexnum; i++) 8 { 9 G.matrix[i]=new int[G.vexnum]; 10 for(int j=0; j<G.vexnum; j++) 11 { 12 G.matrix[i][j]=0; 13 } 14 } 15 16 17 int a,b; 18 for(int i=0; i<G.arcnum; i++) 19 { 20 cin>>a>>b; 21 G.matrix[a][b]=1; 22 G.matrix[b][a]=1; 23 } 24 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 void DFS(Graph G, int k)//深搜 2 { 3 cout<<k<<' '; 4 v[k]=true; 5 for(int i=0; i<G.vexnum; i++) 6 { 7 if(G.matrix[k][i]==1 && !v[i]) 8 { 9 DFS(G,i); 10 } 11 } 12 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 void BFS(Graph G, int k)//广搜 2 { 3 queue<int> q; 4 q.push(k); 5 v[k]=true; 6 cout<<k<<' '; 7 8 9 while(!q.empty()) 10 { 11 int temp=q.front(); 12 q.pop(); 13 for(int i=0; i<G.vexnum; i++) 14 { 15 if(G.matrix[temp][i]==1 && !v[i]) 16 { 17 q.push(i); 18 v[i]=true; 19 cout<<i<<' '; 20 } 21 } 22 } 23 }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 void find(Graph G)//依次输出连通集,先DFS后BFS 2 { 3 for(int i=0; i<G.vexnum; i++)//初始化v[i]数组 4 { 5 v[i]=false; 6 } 7 bool flag=true; 8 for(int i=0; i<G.vexnum; i++) 9 { 10 if(!flag && !v[i]) 11 { 12 cout<<endl<<'{'<<' '; 13 DFS(G,i); 14 cout<<'}'; 15 } 16 else if(flag && !v[i]) 17 { 18 cout<<'{'<<' '; 19 DFS(G,i); 20 cout<<'}'; 21 flag=false; 22 } 23 } 24 25 26 for(int i=0; i<G.vexnum; i++)//重置v[i]数组 27 { 28 v[i]=false; 29 } 30 for(int i=0; i<G.vexnum; i++) 31 { 32 if(!flag && !v[i]) 33 { 34 cout<<endl<<'{'<<' '; 35 BFS(G,i); 36 cout<<'}'; 37 } 38 else if(flag && !v[i]) 39 { 40 cout<<'{'<<' '; 41 BFS(G,i); 42 cout<<'}'; 43 flag=false; 44 } 45 } 46 }
第一次做这个题目的时候,我没有看到题目中最后一句话的要求,然后就用了邻接表去做,后面经过修改后虽然我感觉差不多,但是在PTA提交的时候有个段错误,应该是我太菜了,然后用邻接矩阵做就轻松很多了。
二、同时谈谈你对上次制定目标的完成情况
我自己也不太清楚对于上次目标的完成情况是怎样的,感觉对于图的一些操作的具体实现还不算了然于心,甚至第六章的内容好像也读的不是很透彻,还是要继续努力才是。
三、以及接下来的目标
之后好像还有两章要学,那就学好之后的两章,还有要对这一章图的一些操作的具体实现要更加深刻才行。