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 1 3

0 3 2 1 4

#include<iostream>
using namespace std;
const int maxlen= 20;
class Deep{
	private:
	  bool visit[maxlen];
	  int maxtrix[maxlen][maxlen];
	  int vexnum;	
	  
	  void DFS(int v){//深度优先搜索
	  	  visit[v]= true;
	  	  cout<<v<<' ';
	  	  
	  	  int * adj= new int[vexnum+ 5];
	  	  for(int i= 0; i< vexnum; i++)
	  	   adj[i]= -1;
	  	  
	  	  int pos= 0;
	  	  for(int i= 0; i< vexnum; i++){//找到与v相连的节点
	  	  	  if(maxtrix[v][i])
	  	  	    adj[pos++]= i;
			} 
		
          //对没遍历过的节点调用深度优先搜索
          for(int i= 0; i< pos; i++){
          	if(!visit[adj[i]])
          	  DFS(adj[i]);
		  }
	  }
	public:
		void setMatrix(int vnum, int mx[maxlen][maxlen]){//初始化
		    vexnum= vnum;
			
			for(int i= 0; i< vexnum; i++)
			   for(int j= 0; j< vexnum; j++){
			   	  maxtrix[i][j]= 0;
			   	
			   }
			for(int i= 0; i< vexnum; i++)	
			   for(int j= 0 ; j< vexnum; j++)
			     maxtrix[i][j]= mx[i][j];
		}
		void DFSvisit(){

			for(int i= 0; i< vexnum ;i++)//初始时所有的节点都没遍历过
			  visit[i]= false;
			
			for(int i= 0; i< vexnum; i++)
			  if(!visit[i])
			   DFS(i);
			
			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];
		
		Deep deep;
		deep.setMatrix(n, mx);
		deep.DFSvisit();
	}
	return  0;
	
}

 

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