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

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

题目描述

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

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->DFSTraverse();
		cout<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41879093/article/details/83552173
今日推荐