中国大学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成果:

  

posted @ 2015-01-02 14:48  聪明的聪聪  阅读(625)  评论(0编辑  收藏  举报