DS图遍历--深度优先搜索
程序员文章站
2022-03-03 11:19:48
...
给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点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);
public:
void SetMatrix(int vnum,int **mx);
void DFSTraverse();
};
void Map::SetMatrix(int vnum,int **mx)
{
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<Vexnum;i++)
for(j=0;j<Vexnum;j++)
Matrix[i][j]=mx[i][j];
}
void Map::DFSTraverse()
{
int v;
for(int i=0;i<MaxLen;i++)
Visit[i]=false;
for(int i=0;i<Vexnum;i++)
{
if(!Visit[i])
DFS(i);
}
cout<<endl;
}
void Map::DFS(int v)
{
int i,k;
if(!Visit[v])
{
cout<<v<<' ';
Visit[v]=true;
}
int *AdjVex=new int[Vexnum];
for(int i=0;i<Vexnum;i++)
AdjVex[i]=-1;
k=0;
for(int p=0;p<Vexnum;p++)
{
if(Matrix[v][p]!=0 &&!Visit[p])
{
AdjVex[k]=p;
k++;
}
}
i=0;
while(AdjVex[i]!=-1)
{
DFS(AdjVex[i]);
i++;
}
delete []AdjVex;
}
void test()
{
Map t;
int n;
cin>>n;
int **m;
m=new int*[n];
for(int i=0;i<n;i++)
{
m[i]=new int[n];
for(int j=0;j<n;j++)
{
cin>>m[i][j];
}
}
t.SetMatrix(n,m);
t.DFSTraverse();
}
int main()
{
int t;
cin>>t;
while(t--)
test();
}
下一篇: DS图—图的邻接矩阵存储及度计算