zoukankan      html  css  js  c++  java
  • 中国大学MOOC数据结构基础习题集、051、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成果:

      

  • 相关阅读:
    php的基础知识(三)
    php的基础知识(二)
    css的基础用法(下)
    css的基础用法(上)
    Conceptual blockbusting--chap7 Kinds of blockbusters
    Conceptual blockbusting--chap6 Alternate thinking languages
    Conceptual blockbusting--chap5 Intellectual and Expressive blocks
    Conceptual blockbusting--chap4 Cultural and Environmental blocks
    Conceptual blockbusting
    Conceptual blockbusting- chap2 perceptual blocks
  • 原文地址:https://www.cnblogs.com/clevercong/p/4198448.html
Copyright © 2011-2022 走看看