中国大学MOOC-陈越、何钦铭-数据结构 列出连通集

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

输入格式:

输入第1行给出2个整数N(0

#include<iostream>
using namespace std;
#define MaxSize 10//定义邻接矩阵的最大大小为10x10
typedef int Vertex;//用来表示边
int Graph[MaxSize][MaxSize];//以邻接矩阵的方式存储图
bool Visited[MaxSize];//表示节点是否已经被访问
int queue[MaxSize] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 };//BFS用到的队列。因为本题只用存储边的信息,所以队列不需要太复杂
void MakeGraph(int NV,int NE){
    Vertex v1, v2;
    for (int i = 0; i < NE; i++){
        cin >> v1 >> v2;
        Graph[v1][v2] = 1;//因为是无向图,所以要赋值两次
        Graph[v2][v1] = 1;
    }
}
void DFS(Vertex V,int NV){//传入边和边的数目
    Visited[V] = true;//表示节点已经访问过了
    cout <<" "<< V;//输出V
    for (int i = 0; i < NV; i++){//遍历V的每个邻接点
        if (Graph[V][i] == 1){
            if (!Visited[i]){//如果该邻接点未被访问,则继续访问它
                DFS(i, NV);
            }
}}
}
void Enqueue(Vertex V, int *queue){//入队
    int i;
    for ( i= 0; i < MaxSize; i++){//遍历找到一个不为-1的节点
        if (queue[i] == -1)
            break;
    }
    queue[i] = V;
}
bool IsEmpty(int *queue){
    return queue[0] == -1;//queue[0]!=-1表示队列不为空
}
Vertex Dequeue(int *queue){//出队
    Vertex temp = queue[0];
    for (int i = 0; i < MaxSize - 1; i++){
        queue[i] = queue[i + 1];
    }
    queue[MaxSize - 1] = -1;
    return temp;
}
void BFS(Vertex V, int NV){//传入边和边的数目
    Vertex v;
    Visited[V] = true;
    cout << " " << V;
    Enqueue(V, queue);
    while (!IsEmpty(queue)){//队列不为空
        v = Dequeue(queue);//出队     
        for (int i = 0; i < MaxSize; i++){
            if (Graph[v][i] == 1){//对v的每个邻接点
                if (!Visited[i]){//如果该节点未被访问过,就对该节点进行访问
                    Visited[i] = true;
                    cout << " " << i;
                    Enqueue(i, queue);//入队
                }   }   }}
}
void ListCompent(int Graph[10][10],int NV,int Choose){
    int i, j;
    for (i = 0; i < NV; i++){
        for (j = 0; j < NV; j++){
            if (!Visited[i]){//如果i未被访问过
            if (Graph[i][j] == 1){
                    switch (Choose)//根据Choose选择调用DFS还是BFS
                    {
                    case 1:cout << "{"; DFS(i, NV); cout << " }" << endl; break;
                    case 2:cout << "{"; BFS(i, NV); cout << " }" << endl; break;
                    }
                }
                }
        }
        if (!Visited[i]){ cout << "{ " << i << " }" << endl; }//!Visit[i],表示该节点是孤立点
    }
}
int main(){
    int nv, ne;
    cin >> nv >> ne;
    MakeGraph(nv, ne);
    ListCompent(Graph, nv, 1);
    for (int i = 0; i < MaxSize; i++){//重置访问状态,为了继续进行BFS访问
        Visited[i] = 0;
    }
    ListCompent(Graph, nv, 2);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值