zoukankan      html  css  js  c++  java
  • pta 编程题15 列出连通集

    其它pta数据结构编程题请参见:pta

    题目

    题目要求分别以深度优先搜索和广度优先搜索输出图的连通集。

    广度优先搜索要用到队列,先回顾一下循环队列:

     1 struct QNode {
     2     int* Data;     /* 存储元素的数组 */
     3     int Front, Rear;  /* 队列的头、尾指针 */
     4     int MaxSize;           /* 队列最大容量 */
     5 };
     6 typedef struct QNode *Queue;
     7 
     8 Queue CreateQueue( int MaxSize )
     9 {
    10     Queue Q = new QNode;
    11     Q->Data = new int[MaxSize];
    12     Q->Front = Q->Rear = 0;
    13     Q->MaxSize = MaxSize;
    14     return Q;
    15 }
    16 
    17 bool IsFull( Queue Q )
    18 {
    19     return ((Q->Rear+1)%Q->MaxSize == Q->Front);
    20 }
    21  
    22 void enQueue( Queue Q, ElementType X )
    23 {
    24     Q->Rear = (Q->Rear+1)%Q->MaxSize;
    25     Q->Data[Q->Rear] = X;
    26 }
    27  
    28 bool IsEmpty( Queue Q )
    29 {
    30     return (Q->Front == Q->Rear);
    31 }
    32  
    33 int deQueue( Queue Q )
    34 {
    35     Q->Front =(Q->Front+1)%Q->MaxSize;
    36     return  Q->Data[Q->Front];
    37 }

    注意广度优先搜索BFS要在一个顶点入队的时候将其标记,而不是出队的时候。

    另外c++全局变量会默认初始化。

    还有形参要加上引用符号,否则改变不了实参的值。

      1 #include <iostream>
      2 using namespace std;
      3 
      4 struct Queue
      5 {
      6     int data[11];
      7     int head = 0;
      8     int tail = 0;
      9 };
     10 
     11 int G[10][10];                //全局变量已
     12 bool marked[10], marked2[10]; //默认初始化
     13 void buildGraph(int E);
     14 void dfs(int s);
     15 void bfs(int s);
     16 
     17 void enQueue(Queue& q, int a);
     18 int deQueue(Queue& q);
     19 bool isEmpty(Queue q);
     20 
     21 int main()
     22 {
     23     int N, E, i;
     24     cin >> N >> E;
     25     buildGraph(E);
     26     for (i = 0; i < N; i++)
     27     {
     28         if (!marked[i])
     29         {
     30             cout << "{";
     31             dfs(i);
     32             cout << " }" << endl;
     33         }
     34     }
     35     for (i = 0; i < N; i++)
     36     if (!marked2[i])
     37         bfs(i);
     38     return 0;
     39 }
     40 
     41 void buildGraph(int E)
     42 {
     43     int v1, v2, i;
     44     for (i = 0; i < E; i++)
     45     {
     46         cin >> v1 >> v2;
     47         G[v1][v2] = 1;
     48         G[v2][v1] = 1;
     49     }
     50 }
     51 
     52 void dfs(int s)
     53 {
     54     cout << " " << s;
     55     marked[s] = true;
     56     for (int i = 0; i < 10; i++)
     57     {
     58         if (G[s][i] && !marked[i])
     59             dfs(i);
     60     }
     61 }
     62 
     63 void bfs(int s)
     64 {
     65     int t, i;
     66     Queue q;
     67     enQueue(q, s);
     68     marked2[s] = true;
     69     cout << "{";
     70     while (!isEmpty(q))
     71     {
     72         t = deQueue(q);
     73         cout << " " << t;
     74         for (i = 0; i < 10; i++)
     75         {
     76             if (G[t][i] && !marked2[i])
     77             {
     78                 enQueue(q, i);
     79                 marked2[i] = true;
     80             }
     81         }
     82     }
     83     cout << " }" << endl;
     84 }
     85 
     86 void enQueue(Queue& q, int a)
     87 {
     88     q.tail = (q.tail + 1) % 10;
     89     q.data[q.tail] = a;
     90 }
     91 
     92 int deQueue(Queue& q)
     93 {
     94     q.head = (q.head + 1) % 10;
     95     return q.data[q.head];
     96 }
     97 
     98 bool isEmpty(Queue q)
     99 {
    100     return q.head == q.tail;
    101 }
  • 相关阅读:
    织网的日子里——第一章:TCP时间获取之客户端和服务器端程序
    Hdu 4517 小小明系列故事——游戏的烦恼
    MongoDB安装配置
    【算法学习】线性时间排序计数排序、基数排序和桶排序详解与编程实现
    C++中宏的使用技巧
    每三小时热备shell脚本文件
    OSS音频编程实例
    MySQL的Illegal mix of collationsy异常原因和解决方法
    SQL用了Union后的排序问题
    union 时只能查出一个表中的信息,另一个表只能查出字段
  • 原文地址:https://www.cnblogs.com/lxc1910/p/8955006.html
Copyright © 2011-2022 走看看