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?? }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

输入样例:

8 6
0 7
0 1
2 0
4 1
2 4
3 5

输出样例:

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }
/* 思路:
    1.从图的一个节点 一次dfs,bfs即得到一个连通集
    2.对未访问过节点重复进行操作1.
*/
#include "iostream"
#include "string.h"
#include "queue"
using namespace std;
int map[10][10];
bool visited[10];
int result[10];
int k;
int n, m;
/* 深搜 */
void dfs(int x) {
    result[k++] = x;
    visited[x] = true;
    for (int i = 0; i < n; i++) {
        if (map[x][i] == 1 && !visited[i]) {
            dfs(i);
        }
    }
}

/* 广搜 */
void bfs(int x) {
    queue<int> q;
    q.push(x);
    visited[x] = 1;
    result[k++] = x;
    while (!q.empty()) {
        int l = q.front();
        q.pop();
        for (int i = 0; i < n; i++) {
            if (map[l][i] == 1 && !visited[i]) {
                visited[i] = 1;
                result[k++] = i;
                q.push(i);
            }
        }
    }
}
int main() {
    cin >> n >> m;
    memset(visited, 0, sizeof(visited));
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            map[i][j] = 0;
    while (m--) {
        int i, j;
        cin >> i >> j;
        map[i][j] = 1;
        map[j][i] = 1;
    }
    ///* 列出图深搜所有的连通集 */
    for (int i = 0; i < n; i++)
    {
        k = 0;
        if (!visited[i]) {
            dfs(i);
            cout << "{ ";
            for (int i = 0; i < k; i++)
                cout << result[i] << " ";
            cout << "}" << endl;
        }
    }
    memset(visited, 0, sizeof(visited));
    /* 列出图广搜所有的连通集 */
    for (int i = 0; i < n; i++)
    {
        k = 0;
        if (!visited[i]) {
            bfs(i);
            cout << "{ ";
            for (int i = 0; i < k; i++)
                cout << result[i] << " ";
            cout << "}" << endl;
        }
    }
}
时间: 2024-10-13 16:00:29

PTA - - 06-图1 列出连通集 (25分)的相关文章

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

题目描述 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N?1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数.随后E行,每行给出一条边的两个端点.每行中的数字之间用1空格分隔. 输出格式: 按照"{v1 v2 ... vk}"的格式,每行输出一个连通集.先输出DFS的结果,再输出BFS的结果. 输入样例: 8 6 0 7

06-图1 列出连通集 (25分)(C语言邻接表实现)

题目地址:https://pta.patest.cn/pta/test/558/exam/4/question/9495 由于边数E<(n*(n-1))/2 所以我选用了邻接表实现,优先队列用循环队列实现: DFS基本思路: 1:选择一个点,标志已经访问过: 2:判断这个点的其他邻接点(访问顺序按题目是从小到大)是否访问过,来选择下一个点: 3:重复第2点知道全部点已经访问过. 伪代码如下 DFS( Vertex v ) { Visit( V ); Visited[V] = true; fore

PTA 10-排序5 PAT Judge (25分)

题目地址 https://pta.patest.cn/pta/test/16/exam/4/question/677 5-15 PAT Judge   (25分) The ranklist of PAT is generated from the status list, which shows the scores of the submissions. This time you are supposed to generate the ranklist for PAT. Input Spe

PTA乙级 (*1030 完美数列 (25分))

1030 完美数列 (25分) https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224 #include <iostream> #include <vector> #include <algorithm> typedef long long ll; using namespace std; int main() { int n; ll p; cin>>n>

PTA乙级(*1050 螺旋矩阵 (25分))

1050 螺旋矩阵 (25分) https://pintia.cn/problem-sets/994805260223102976/problems/994805275146436608 https://paste.ubuntu.com/p/Dn7fQ9Gf73/ #include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cmath>

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 MaxSiz

PTA 07-图4 哈利&#183;波特的考试 (25分)

/* 1.用floyd 求多源最短路径~ 2.找出节点k到其他节点的最短路径的最大值 MAX[k]. 3 在找出MAX数组中最小的即为所求~~ 如果最小值为INF~~~ 说明图不连通! 输出0 */ #include "iostream" using namespace std; #define INF 101 int map[101][101]; void floyd(int v) { int i, j, k; for(k=1;k<=v;k++) for(i=1;i<=v

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

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

7-1 列出连通集 (25 分)

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