第六章学习小结
一. 完成作业或实践时解决困难的经验分享
这部分讲作业的列出连通集
题目:
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。
输出格式:
按照"{ v1 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 <cstring> 3 #include <queue> 4 using namespace std; 5 #define MVNum 10 6 7 typedef struct 8 { 9 int vex[MVNum];//顶点表 10 int arcs[MVNum][MVNum];//邻接矩阵 11 int vexnum, arcnum;//图的点数和边数 12 }AMGraph; 13 14 void CreateUDN(AMGraph &G); 15 void DFS(AMGraph G, int v); 16 void BFS(AMGraph G, int v); 17 18 int visited[MVNum]={0};//定义为全局变量 19 20 int main() 21 { 22 AMGraph G; 23 int i=0; 24 CreateUDN(G); 25 for(i=0;i<G.vexnum;++i) 26 { 27 if(visited[i]==0) 28 {//若顶点i没被访问过,则从顶点i深搜 29 cout<<"{ "; 30 DFS(G,i); 31 cout<<"}"<<endl; 32 } 33 } 34 35 memset(visited,0,sizeof(visited));//重置visited数组 36 37 for(i=0;i<G.vexnum;++i) 38 { 39 if(visited[i]==0) 40 {//顶点i没被访问过 从i开始广搜 41 cout<<"{ "; 42 BFS(G,i); 43 cout<<"}"<<endl; 44 } 45 } 46 return 0; 47 } 48 49 void CreateUDN(AMGraph &G) 50 { 51 int i; 52 int v1, v2; 53 cin>>G.vexnum>>G.arcnum;//输入总顶点数、总边数 54 memset(G.arcs,0,sizeof(G.arcs));//初始化邻接矩阵 55 for(i=0;i<G.vexnum;++i) 56 G.vex[i]=i;//初始化顶点表 57 58 for(i=0;i<G.arcnum;++i) 59 {//输入边的数据 60 cin>>v1>>v2; 61 G.arcs[v1][v2]=1;//置边的权值为1 62 G.arcs[v2][v1]=1;//无向图 63 } 64 } 65 66 67 void DFS(AMGraph G, int v) 68 {//从顶点v出发,深度优先搜索遍历连通图G 69 visited[v]=1;//标记v已被访问 70 cout<<v<<" "; 71 for(int i=0;i<G.vexnum;++i) 72 { 73 if(G.arcs[i][v]==1 && (visited[i]==0))//邻接点i存在且没有被访问过 74 DFS(G,i);//对v的尚未访问的邻接顶点i进行递归调用DFS 75 } 76 } 77 78 void BFS(AMGraph G, int v) 79 {//从顶点v出发广搜v所在的连通分量 80 int g; 81 queue<int> q; 82 visited[v]=1;//标记v已被访问 83 q.push(v); 84 85 while(!q.empty()) 86 { 87 g=q.front(); 88 q.pop(); 89 cout<<g<<" "; 90 for(int i=0;i<G.vexnum;++i) 91 if(G.arcs[i][g]==1 && visited[i]==0) 92 {//如果顶点i存在且没有被访问过 93 visited[i]=1; 94 q.push(i);//i入队 95 } 96 } 97 }
这是同学教我的,把代码大致思路给我讲了,注释也很详细,我自己原本的有很大问题,但是不会解决
原本代码:
一开始的错误还是格式就是每行中的数字之间用1空格分隔,然后就改成了
1 void ListComponentsWithDFS()//结点是否被访问的标记向量 2 {//根据深度优先遍历输出图的联通集团 3 for (int V = 0; V < n; V++) 4 if (!Visited[V]) 5 { 6 cout<<"{"<<" "; 7 DFS(V); 8 cout<<" "<<"}"<<endl; 9 } 10 }
1 void ListComponentsWithBFS()//结点是否被访问的标记向量 2 {//根据广度优先遍历输出图的联通集团 3 for (int V = 0; V < n; V++) 4 if (!Visited[V]) 5 { 6 cout<<"{"<<" "; 7 BFS(V); 8 cout<<" "<<"}"<<endl; 9 } 10 }
1 void DFS(int V) 2 { 3 Visited[V] = true; 4 cout<<V<<" "; 5 for (int i = 0; i < n; i++) 6 { 7 if (G[V][i] && !Visited[i]) 8 DFS(i); 9 } 10 }//深度优先搜索
改完以后美滋滋地去PTA测试,绝了。。还是错的并且我看不懂。。
全部代码:
1 #include <iostream> 2 using namespace std; 3 #define N 10 4 5 void ListComponentsWithDFS(); 6 void ListComponentsWithBFS(); 7 void DFS(int V); 8 void BFS(int V); 9 void InitVisit(void); 10 11 int n; 12 bool Visited[N]; 13 int G[N][N] = {0};//初始化图的邻接矩阵 14 15 int main() 16 { 17 int E; 18 19 cin>>n>>E; 20 for (int i = 0; i < E; i++)//修改图的邻接矩阵 21 { 22 int a, b; 23 cin>>a>>b; 24 G[b][a] = G[a][b] = 1; 25 } 26 27 ListComponentsWithDFS(); 28 InitVisit(); 29 ListComponentsWithBFS(); 30 31 return 0; 32 } 33 34 void ListComponentsWithDFS()//结点是否被访问的标记向量 35 {//根据深度优先遍历输出图的联通集团 36 for (int V = 0; V < n; V++) 37 if (!Visited[V]) 38 { 39 cout<<"{"<<" "; 40 DFS(V); 41 cout<<" "<<"}"<<endl; 42 } 43 } 44 45 void ListComponentsWithBFS()//结点是否被访问的标记向量 46 {//根据广度优先遍历输出图的联通集团 47 for (int V = 0; V < n; V++) 48 if (!Visited[V]) 49 { 50 cout<<"{"<<" "; 51 BFS(V); 52 cout<<" "<<"}"<<endl; 53 } 54 } 55 56 void DFS(int V) 57 { 58 Visited[V] = true; 59 cout<<V<<" "; 60 for (int i = 0; i < n; i++) 61 { 62 if (G[V][i] && !Visited[i]) 63 DFS(i); 64 } 65 }//深度优先搜索 66 67 void BFS(int V) 68 { 69 const int MAX_SIZE = 100; 70 int Queue[MAX_SIZE]; 71 int first = -1, rear = -1; 72 73 Queue[++rear] = V; //入队 74 cout<<V<<" ";Visited[V] = 1; 75 while(rear!=first)//当队不为空时 76 { 77 V = Queue[++first];//出队 78 for(int i=0;i < N;i++) 79 if(G[V][i]==1&&Visited[i]==0) 80 { 81 Queue[++rear] = i;//入队 82 cout<<i<<" ";Visited[i] = 1; 83 } 84 } 85 }//广度优先搜索 86 87 void InitVisit() 88 { 89 for (int i = 0; i < N; i++) 90 Visited[i] = false; 91 }
如果可以希望老师帮忙指点一下,然后测试的图片博客园发不了。。(还不会啦)
二.目标
这一周学习还可以吧,理解感觉要比树透彻,就是代码写错了5555
下次的目标:多练代码啊啊啊啊,拓宽自己的学习
浙公网安备 33010602011771号