1. 程式人生 > >pta 編程題15 列出連通集

pta 編程題15 列出連通集

www turn namespace 循環隊列 深度 dfs 一個 head 出圖

其它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 }

pta 編程題15 列出連通集