第六章学习小结

第六章学习小结

  上周,我们学习了图的相关内容,图的内容很多,所以我将它又重新理顺了一遍,因为是在笔记本上写的,导出来就变成一张图了

PTA题目:列出连通集

 

 

给定一个有1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

 

输入格式:

 

输入第1行给出2个整数N(0<N10)和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算法。

 

 

 

posted @ 2019-05-19 23:28  Hycomin  阅读(289)  评论(2编辑  收藏  举报