#include<iostream>
using namespace std;
const int MaxLen = 20; //设定图最多包含20个顶点
class Map{
private:
bool Visit[MaxLen]; //访问标志数组,标识每个顶点是否已访问
int Matrix[MaxLen][MaxLen];//图的邻接矩阵
int Vexnum; //图的顶点数量
void DFS(int v); //深度优先,私有函数,内部调用
public:
void SetMatrix(int vnum,int **mx);
void DFSTraverse(); //共有函数,被main调用
};
//设置邻接矩阵
void Map::SetMatrix(int vnum,int **mx){
int i,j;
Vexnum = vnum;
for(i=0; i<vnum; i++)
for(j=0; j<vnum; j++)
Matrix[i][j] = mx[i][j];
}
void Map::DFSTraverse(){
//对图G做深度优先遍历,共有函数
int v;
//代码2行,把访问标志数组的值全部设为false
for(v=0; v<Vexnum; v++)
Visit[v] = false;
//代码2-3行,从v=0开始,对所有顶点进行检查
//如果该顶点未访问,则调用DFS函数进行深度优先搜索
for(v=0; v<Vexnum; v++)
if(!Visit[v]) DFS(v);
cout<<endl;
}
//深度优先搜索
void Map::DFS(int v){
int w, i, k;
//2行代码,先对顶点v进行访问,执行操作包括:
//1.设置visit数组的第v个位置为true,标识已访问
//2.输出数值v再输出一个空格,标识当前顶点已访问,并用空格隔开
Visit[v] = true;
cout << v << " ";
//访问与v连接且没有访问过的结点
for( i=0; i<Vexnum; i++ ){
if( Matrix[v][i]==1 && !Visit[i] )
DFS(i);
}
}
int main()
{
int t,i,j;
int n;
int **Matrix;
cin >>t;
while(t--){
cin >> n;
Matrix = new int*[n];
for(i=0;i<n;i++)
Matrix[i] = new int[n];
for(i=0; i<n; i++)
for(j=0; j<n; j++)
cin >> Matrix[i][j];
Map m;
m.SetMatrix(n,Matrix);
m.DFSTraverse();
for(i=0; i<n; i++)
delete []Matrix[i];
delete []Matrix;
}
}
网友评论