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

Posted keiiha

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06-图1 列出连通集 (25 分)相关的知识,希望对你有一定的参考价值。

 

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

输入格式:

输入第1行给出2个整数N(0<N10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

输出格式:

按照"{ v1​​ v2​​ ... vk​​ }"的格式,每行输出一个连通集。先输出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 }

 

无向图

邻接矩阵的BFS和DFS遍历 以及 连通集的输出 关联题目可以做最大联通子集

 

#include <iostream>
#include <vector>
using namespace std;
class MGraphic{
public:
    vector<int> vertex;//
    vector<vector<int>> edge;//边矩阵
    int vertexNum,arcNum;
    MGraphic()=default;
    MGraphic(int n,int e)
    :vertex{vector<int>(n)},edge{vector<vector<int>>(n,vector<int>(n))},vertexNum{n},arcNum{e}{};
    void insertEdge(int i,int j){
        edge[i][j] = 1;
        edge[j][i] = 1;
    }
    void build(int n){
        int a,b;
        for(int i=0;i<n;i++){
            cin >>a >> b;
            insertEdge(a, b);
        }
    }
    void DFS(int i,vector<int> &visited,vector<int> &vertexs){
        for(int j=0;j<visited.size();j++){
            if(!visited[j]&&edge[i][j]){
                visited[j]=1;
                vertexs.push_back(j);
                DFS(j, visited,vertexs);
            }
        }
    }
    void DFSTraversal(){
        vector<int> visited=vertex;
        for(int i=0;i<visited.size();i++){
            if(!visited[i]){
                visited[i]=1;
                vector<int> vertexs;
                vertexs.push_back(i);
                DFS(i, visited, vertexs);
                cout << "{";
                for(int j=0;j<vertexs.size();j++){
                    cout << " "<< vertexs[j];
                }
                cout << " }"<<endl;
            }
        }
    }
    void BFSTraversal(){
        vector<int> visited=vertex;
        vector<int> queue;
        for(int i=0;i<visited.size();i++){
            if(!visited[i]){
                visited[i]=1;
                queue.push_back(i);
                vector<int> vertexs;
                vertexs.push_back(i);
                while(queue.size()){
                    for(int j=0;j<visited.size();j++){
                        if(edge[queue.front()][j]&&!visited[j]){
                            visited[j]=1;
                            queue.push_back(j);
                            vertexs.push_back(j);
                        }
                    }
                    queue.erase(queue.begin());
                }
                cout << "{";
                for(int j=0;j<vertexs.size();j++){
                    cout << " "<< vertexs[j];
                }
                cout << " }"<<endl;
            }
        }
    }
};
int main(){
    int n,e;
    cin >> n >> e;
    MGraphic mg(n,e);
    mg.build(e);
    mg.DFSTraversal();
    mg.BFSTraversal();
    return 0;
}

 

以上是关于06-图1 列出连通集 (25 分)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

列出连通集