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 }