这里给出利用邻接矩阵和邻接表存储地点信息的深搜和广搜。
邻接矩阵:
#include<bits/stdc++.h>
using namespace std;
int book[155]; //标记数组
int mps[155][155]; //存地图
int sum; // 记录已经走过的顶点数
int n,m; //顶点数 边数
#define inf 99999999
void dfs(int loc) //深度优先遍搜索
{
cout<<loc<<" ";
sum++;
if(sum==n)
return;
for(int i=1;i<=n;i++)
{
if(mps[loc][i]==1&&book[i]==0)
{
book[i]=1;
dfs(i);
}
}
}
queue<int>q;
void bfs(int loc) //广度优先遍历
{
q.push(loc);
book[loc]=1;
while(!q.empty())
{
int tmp=q.front();
for(int i=1;i<=n;i++)
{
if(book[i]==0&&mps[tmp][i]==1)
{
q.push(i);
book[i]=1;
}
}
cout<<q.front()<<" ";
q.pop();
}
}
int main()
{
cin>>n>>m; // 定点数 边数
for(int i=1;i<=n;i++) // 图初始化
for(int j=1;j<=n;j++)
mps[i][j]=inf;
for(int i=1;i<=m;i++) //构建图
{
int x,y; // 起点 终点
cin>>x>>y;
mps[x][y]=1;
mps[y][x]=1;
}
book[1]=1;
cout<<"深度优先搜索结果为:";
dfs(1);
cout<<endl;
memset(book,0,sizeof(book)); //将标记数组book初始化为0
cout<<"广度优先遍历结果为:";
bfs(1);
return 0;
}
/**
5 5
1 2
1 3
1 5
2 4
3 5
1 2 4 3 5
1 2 3 5 4
*/
邻接表:
#include<bits/stdc++.h>
using namespace std;
const int N =1e5+5;
vector<int>v[N];
int n,book[N],k,m;
queue<int>q;
int cnt;
void dfs(int cur)
{
book[1]=1;
cout<<cur<<" ";
cnt++;
if(cnt>=n)
return;
for(int i=0;i<v[cur].size();i++)
{
if(book[v[cur][i]]==0)
{
book[v[cur][i]]=1;
dfs(v[cur][i]);
}
}
}
void bfs()
{
book[1]=1;
q.push(1);
while(!q.empty())
{
int tmp=q.front();
for(int i=0;i<v[tmp].size();i++)
{
if(book[v[tmp][i]]==0)
{
q.push(v[tmp][i]);
book[v[tmp][i]]=1;
}
}
cout<<tmp<<" ";
q.pop();
}
}
int main(){
cin>>n>>m;
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1);
cout<<endl;
memset(book,0,sizeof(book));
bfs();
return 0;
}
/**
5 5
1 2
1 3
1 5
2 4
3 5
1 2 4 3 5
1 2 3 5 4
*/