DS图遍历--广度优先搜索

版权声明:转载请注明出处 https://blog.csdn.net/weixin_41879093/article/details/83552200

题目描述

给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点0开始

注意:图n个顶点编号从0到n-1

输入

第一行输入t,表示有t个测试实例

第二行输入n,表示第1个图有n个结点

第三行起,每行输入邻接矩阵的一行,以此类推输入n行

第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开

以此类推输入下一个示例

输出

每行输出一个图的广度优先搜索结果,结点编号之间用空格隔开

样例输入

2

4

0 0 1 1

0 0 1 1

1 1 0 1

1 1 1 0

5

0 0 0 1 1

0 0 1 0 0

0 1 0 1 1

1 0 1 0 0

1 0 1 0 0

样例输出

0 2 3 1

0 3 4 2 1

#include<iostream>
#include<queue>
using namespace std;
 
const int maxlen= 20;
 
class Map{
    private:
        bool visit[maxlen];
        int matrix[maxlen][maxlen];
        int vexnum;
        void DFS(int v){
            int w, i, k;
             
            visit[v]= true;
            cout<<v<<' ';
             
            int *adjvex= new int[vexnum];
             
            for(i= 0; i< vexnum; i++)
              adjvex[i]= -1;
               
            k= 0;
             
            for(i= 0; i< vexnum; i++){
                if(matrix[v][i]){
                    adjvex[k++]= i;
                }
            }
             
            i= 0;
            for(w= adjvex[i++]; w>= 0; w= adjvex[i++]){
                 
                if(!visit[w])
                  DFS(w);
            }
        }
        void BFS(int v){
            int w, u;
            int i, k;
            int *adjvex= new int [maxlen];
             
             
            queue<int> q;
             
            for(i= 0; i< vexnum; i++)
              visit[i]= false;
 
               
            for(v= 0; v< vexnum; v++){
                if(!visit[v]){
                    visit[v]= true;
                    q.push(v);
                    //cout<<v<<' ';
                     
                    while(!q.empty()){
                        u= q.front();
                        cout<<u<<' ';
                        q.pop();
                         
                         for(i= 0; i< maxlen; i++)
                           adjvex[i]= -1;
                             
                        int pos= 0;             
                        for(k= 0; k< vexnum; k++){
                            if(matrix[u][k]){
                                adjvex[pos++]= k;
                               
                            }
                               
                        }
                         
                        i= 0;
                         
                        for(w= adjvex[i]; w>= 0; w= adjvex[i++]){
                             if(visit[w]== false){
                                 
                                visit[w]= true;
                                 
                                q.push(w);
                             }
                        }
                         
                         
                         
                    }
                }
            }
             
            cout<<endl;
        }
    public :
        void setmatrix(int vnum, int mx[maxlen][maxlen]){
            int i, j;
            vexnum= vnum;
            for(i= 0; i< maxlen; i++){
                for(j= 0; j< maxlen; j++){
                    matrix[i][j]= 0;
                }
            }
             
            for(i= 0; i< maxlen; i++){
                for(j= 0; j< vexnum; j++){
                    matrix[i][j]= mx[i][j];
                }
            }
        }
        void DFSTraverse(){
            int v;
             
            for(int i= 0; i< vexnum; i++)
              visit[i]= false;
              
            for(v= 0; v< vexnum; v++){
                if(!visit[v]){
                    DFS(v);
                }   
            }
             
        }
        void BFStraverse(){
            BFS(0);
        }
};
 
int main(){
    int t;
    cin>>t;
    while(t--){
        int n; 
        cin>>n;
        int mx[maxlen][maxlen];
         
        for(int i= 0; i< n; i++)
          for(int j= 0; j< n; j++)
           cin>>mx[i][j];
         
        //Map map;
        Map* map;
        map= new Map();
        map->setmatrix(n, mx);
        map->BFStraverse();
        //cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/83552200