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 }

猜你喜欢

转载自www.cnblogs.com/lxc1910/p/8955006.html