pta 編程題15 列出連通集
阿新 • • 發佈:2018-04-27
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 = newQNode; 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 列出連通集