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

题目描述

 

给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点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 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 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;
    }
}

 优化后的代码:

#include<iostream>
#include<queue>
using namespace std;
const int maxlen = 20;
class BF{
	private:
		int maxtrix[maxlen][maxlen];
		int vexnum;
		int *visit;
		void BFS(int start){//广度优先遍历
			queue<int > que;
			que.push(start);
			
			while(!que.empty()){
				int st= que.front();
				que.pop();
				visit[st]= 1;
				cout<<st<<' ';
				
				for(int i= 0;i< vexnum; i++){
					if(maxtrix[st][i]&&!visit[i]){
						visit[i]= 1;//这里得改变i已被遍历,否则将会重复遍历
						que.push(i);
					}
				}
			}
		}
	public :
		void setMx(int mx[maxlen][maxlen], int vnum){
			vexnum= vnum;
			visit= new int[vnum+ 5];
			
			for(int i= 0; i< vexnum ;i++)
			 visit[i]= 0;
			for(int i= 0; i< vexnum; i++){
				for(int j= 0; j< vexnum; j++)
				  maxtrix[i][j]= mx[i][j];
			}
		}
		void BFS(){
			BFS(0);
			cout<<endl;
		}
};
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];
		
		BF bf;
		bf.setMx(mx, n);
		bf.BFS();
	}
	return 0;
}

 

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/weixin_41879093/article/details/83552200
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞