DS第6章学习小结

一、谈谈你对本章的学习心得,或者任选本章一道题目,谈谈你解决该题的心得体会

  图的存储结构,当下我们应当掌握得很透彻的,有两种,邻接矩阵邻接表

  关于图的遍历方式,也有两种,深度优先搜索(DFS)广度优先搜索(BFS)

  然后,PTA上  第7章作业7-1 列出连通集  很好的考察了DFS和BFS的具体实现。

  首先是题目要求:

    

  因为题目中有个比较坑的要求,

    

  所以我推荐用邻接矩阵的存储结构去创建图。(如果用邻接表去整,还要将邻接表中的邻接点域按从小到大排,麻烦)

 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];
View Code

  这是写代码前要想好的需要些什么结构体、函数、变量。

  然后主函数:

1 int main()
2 {
3     Graph G;
4     CreateUDG(G);
5 
6 
7     find(G);
8 return 0;
9 }
View Code

   然后各个函数的具体代码:

 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 }
View Code
 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 }
View Code
 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 }
View Code
 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 }
View Code

  第一次做这个题目的时候,我没有看到题目中最后一句话的要求,然后就用了邻接表去做,后面经过修改后虽然我感觉差不多,但是在PTA提交的时候有个段错误,应该是我太菜了,然后用邻接矩阵做就轻松很多了。

二、同时谈谈你对上次制定目标的完成情况

  我自己也不太清楚对于上次目标的完成情况是怎样的,感觉对于图的一些操作的具体实现还不算了然于心,甚至第六章的内容好像也读的不是很透彻,还是要继续努力才是。

三、以及接下来的目标

  之后好像还有两章要学,那就学好之后的两章,还有要对这一章图的一些操作的具体实现要更加深刻才行。

猜你喜欢

转载自www.cnblogs.com/ymj19/p/10890374.html
今日推荐