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

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

给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。
输入格式:
输入第1行给出2个整数N(0 输出格式:
按照"{ v​1​​ v​2​​ … v​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 }

本题考查的是对图的遍历

#include
#include
using namespace std;

typedef struct GNode{
    int n;
    int e;
    int AdjMatrix[11][11];
};

struct GNode graph;

void DFS(int visited[],int start)
{
    visited[start] = 1;
    cout<<start<<" ";
    for(int i = 0;i<graph.n;i++)
        if(i!=start&&!visited[i]&&graph.AdjMatrix[start][i])
            DFS(visited,i);
}

void BFS(int visited[],int start)
{
    queue<int> q;
    q.push(start);
    visited[start] = 1;
    while(!q.empty())
    {
        int top = q.front();
        cout<<top<<" ";
        q.pop();
        for(int i = 0;i<graph.n;i++)
            if(i!=top&&!visited[i]&&graph.AdjMatrix[top][i])
            {
                q.push(i);
                visited[i] = 1;
            }
    }
}

int main()
{
    int n,e;
    cin>>n>>e;
    graph.e = e;
    graph.n = n;
    for(int i = 0;i<n;i++)
        for(int j = 0;j<n;j++)
            graph.AdjMatrix[i][j] = 0;  //全初始化为0
    for(int i = 0;i<e;i++)
    {
        int a,b;
        cin>>a>>b;
        graph.AdjMatrix[a][b] = graph.AdjMatrix[b][a] = 1;   //相连通的点之间的邻接矩阵为1
    }
    int visited[11] = {0};
    for(int i = 0;i<n;i++)
        if(!visited[i])
        {
            cout<<"{ ";
            DFS(visited,i);
            cout<<"}"<<endl;
        }
    for(int i = 0;i<=10;i++)
    {
        visited[i] = 0;
    }
    for(int i = 0;i<n;i++)
        if(!visited[i])
        {
            cout<<"{ ";
            BFS(visited,i);
            cout<<"}"<<endl;
        }
    return 0;
}

你可能感兴趣的:(DFS,BFS)