DS图遍历--广度优先搜索
程序员文章站
2022-03-03 11:19:18
...
给出一个图的邻接矩阵,对图进行深度优先搜索,从顶点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 DFS(int v);
void BFS(int v);
public:
void SetMatrix(int vnum,int **mx);
void DFSTraverse();
void BFSTraverse();
};
void Map::BFSTraverse()
{
for(int i=0;i<Vexnum;i++)
Visit[i]=false;
cout<<0<<' ';
Visit[0]=true;
BFS(0);
cout<<endl;
}
void Map::BFS(int v)
{
queue<int> Q;
for(int i=0;i<Vexnum;i++)
{
if(Matrix[v][i]!=0 &&!Visit[i])
{
cout<<i<<' ';
Visit[i]=true;
Q.push(i);
}
}
while(!Q.empty())
{
BFS(Q.front());
Q.pop();
}
}
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.BFSTraverse();
}
int main()
{
int t;
cin>>t;
while(t--)
test();
}
上一篇: 图的顺序存储结构及C语言实现