中国大学MOOC-数据结构基础习题集、05-1、List Components
题目链接:http://www.patest.cn/contests/mooc-ds/05-1
题目分析:这是一道考察图的建立、深度优先遍历、广度优先遍历的一道题,算法是非常基础的。这里只解释一下输入和输出就可以了,相信大家应该能看懂题目。
输入:结点数(N=8),边数(E=6),接下来是各边的信息,共(E=6)行。注意这里是无向图。
输出:深度优先遍历+广度优先遍历的结果。因为图可能不止一个连通分量,所以肯定会有深度和广度都是“多行”的情况。这里要注意的是,一个结点同时连多个结点,按照结点data域的大小升序输出,比如0同时连4,1,7,广度的话就应该是0,1,4,7。深度也是同理。
特别说明:
1. 题目明确说明结点数(N)是小于或等于10的,因此用邻接矩阵可能比较好。
2. 注意输出格式,先是一个花括号,后接一个空格,然后每个数字后面都有一个空格,最后用花括号结尾。
3. 就是上面我“题目分析”所说的,已经用红字标出。
代码分析:
DFS = 图的深度优先遍历,BFS = 图的广度优先遍历,其他我已经写进了注释里,大家看一下就好。
1 #include <iostream> 2 #include <vector> 3 #include <queue> 4 5 #define MAXSIZE 10 6 using namespace std; 7 8 void DFS(int (*data)[MAXSIZE],int i,bool* visited) 9 { 10 if(visited[i] == true) 11 { 12 return ; 13 } 14 cout << i << " "; 15 visited[i] = true; 16 17 for(int j=0; j<MAXSIZE; j++) 18 { 19 if(data[i][j] == 1 && visited[j] == false) 20 { 21 DFS(data, j, visited); 22 } 23 } 24 } 25 26 void BFS(int (*data)[MAXSIZE],int i,bool* visited) 27 { 28 if(visited[i] == true) 29 { 30 return ; 31 } 32 33 queue<int> myQueue; 34 myQueue.push(i); 35 visited[i] = true; 36 37 while(myQueue.size() != 0) 38 { 39 int x = myQueue.front(); 40 cout << x << " "; 41 myQueue.pop(); 42 for(int i=0; i<MAXSIZE; i++) 43 { 44 if(data[x][i] == 1 && visited[i] == false) 45 { 46 visited[i] = true; 47 myQueue.push(i); 48 } 49 } 50 } 51 } 52 53 int main() 54 { 55 int data[MAXSIZE][MAXSIZE] = {0}; 56 bool visitedDFS[MAXSIZE] = {false}; 57 bool visitedBFS[MAXSIZE] = {false}; 58 59 int nNum, eNum; 60 cin >> nNum >> eNum; 61 // 用邻接矩阵存储图 62 for(int i=0; i<eNum; i++) 63 { 64 int a, b; 65 cin >> a >> b; 66 data[a][b] = 1; 67 data[b][a] = 1; 68 } 69 // 深度优先遍历,从数字最小的结点开始遍历 70 71 for(int i=0; i<nNum; i++) 72 { 73 if(!visitedDFS[i]) 74 { 75 cout << "{ "; 76 DFS(data, i, visitedDFS); 77 cout << "}\n"; 78 } 79 } 80 81 // 广度优先遍历,从数字最小的结点开始遍历 82 for(int i=0; i<nNum; i++) 83 { 84 if(!visitedBFS[i]) 85 { 86 cout << "{ "; 87 BFS(data, i, visitedBFS); 88 cout << "}\n"; 89 } 90 } 91 92 return 0; 93 }
AC成果: