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 }

原文地址:https://www.cnblogs.com/lxc1910/p/8955006.html

时间: 2024-07-31 09:23:23

pta 编程题15 列出连通集的相关文章

pta 编程题13 File Transfer

其它pta数据结构编程题请参见:pta 这道题考察的是union-find并查集. 开始把数组中每个元素初始化为-1,代表没有父节点.为了使树更加平衡,可以让每一个连通分量的树根的负值代表这个连通分量包含的节点数,然后在union时把小的树并到大的树上. 另外在find操作时可以用递归的方式使查找路径上的所有节点的父节点都改为根节点,以实现路径压缩,在后续查找过程中会更快. 1 #include <iostream> 2 #include <vector> 3 using name

pta 编程题21 公路村村通

其它pta数据结构编程题请参见:pta 题目 这道题考察最小生成树问题,用的是Prim算法. 1 #include <iostream> 2 using namespace std; 3 4 int N, M; 5 int** G; 6 void buildGraph(); 7 void deleteGraph(); 8 int prim(); 9 int findMinDist(int dist[]); 10 11 int main() 12 { 13 cin >> N >

pta 编程题14 Huffman Codes

题目 题目给出一组字母和每个字母的频数,因为哈夫曼编码不唯一,然后给出几组编码,因为哈夫曼编码不唯一,所以让你判断这些编码是否符合是哈夫曼编码的一种. 解题思路: 1.构造哈夫曼树,并求出总代价COST,即各个字母的频数乘以编码长度的和. 2.对于题目给出的每一组编码,判断是否符合哈夫曼编码,即这组编码是否为前缀码,同时代价cost是否等于计算出的哈夫曼树的代价COST. 判断一组编码是否为前缀码的方法: 将这些编码逐个的添加到哈夫曼树中,对于每一个编码字符串,字符串中的每一个字符也逐个扫描,如

PTA - - 06-图1 列出连通集 (25分)

06-图1 列出连通集   (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1行给出2个整数NN(0<N\le 100<N≤10)和EE,分别是图的顶点数和边数.随后EE行,每行给出一条边的两个端点.每行中的数字之间用1空格分隔. 输出格式: 按照"{ v_1v?1?? v_2v?2?? ... v_kv?k?? 

c++primerplus(第六版)编程题&mdash;&mdash;第6章(分支语句和逻辑运算符)

声明:作者为了调试方便,每一章的程序写在一个工程文件中,每一道编程练习题新建一个独立文件,在主函数中调用,我建议同我一样的初学者可以采用这种方式,调试起来会比较方便. (具体方式参见第3章模板) 1.编写一个小程序,读取键盘输入,直到遇到@符号为止,并回显输入(数字除外),同时将大写字符转换为小写,将小写字符转换为大写(别忘了cctype函数系列). #include <iostream> #include <cctype> using namespace std; void cp

POJ C程序设计进阶 编程题#3:运算符判定

编程题#3:运算符判定 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 两个整数 a 和 b 运算后得到结果 c.表示为:a ? b = c,其中,?可能是加法 +,减法 -,乘法 *,整除 / 或 取余 %.请根据输入的 a,b,c 的值,确定运算符.如果某种运算成立,则输出相应的运算符,如果任何运算都不成立,则输出 error. 例如: 输入: 3,4,5 输出: er

京东校招笔试(C++方向)编程题

这次笔试是今年校招我参加的第一次笔试..出了很多状况,基础知识不扎实,导致选择题耽误了太多时间,导致后面的题目没做完,编程题也没有在 时间内写出来,基本没有面试机会了.不过我继续研究第二个编程题,在10几分钟后做了出来. 这个题目具体已经不记得了,但是大概意思还是记得,我们把由4和7组成的数,按小大排序,例如:4 7 44 47 74 77 444 447 474 477 744 747 774 777 他们的序号依次为1,2,3,4.....,题目的输入是每行输入一个整数,可以很大(好像是最大

期末考试——编程题#2:能被3,5,7整除的数

编程题#2:能被3,5,7整除的数 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个整数,判断它能否被3,5,7整除,并输出以下信息: 1.能同时被3,5,7整除(直接输出3 5 7,每个数中间一个空格): 2.能被其中两个数整除(输出两个数,小的在前,大的在后.例如:3 5或者 3 7或者5 7,中间用空格分隔) 3.能被其中一个数整除(输出这个除数) 4.不能被任

POJ C程序设计进阶 编程题#2:字符串中次数第2多的字母

编程题#2:字符串中次数第2多的字母 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一串长度不超过500个符号的字符串,输出在串中出现第2多的英语字母(大小写字母认为相同)和次数(如果串中有其它符号,则忽略不考虑).如果有多个字母的次数都是第2多,则按串中字母出现的顺序输出第1个. 例 ab&dcAab&c9defgb 这里,a 和 b都出现3次,c和d都出现2