深度优先搜索
- 从某一个顶点出发开始访问,被访问的顶点做相应的标记,输出访问顶点。
- 从被访问的顶点出发,搜索与该顶点有边的关联的某个未被访问的邻接点。
- 再从该邻接点出发进一步搜索与该顶点有边的关联的某个未被访问的邻接点,知道全部顶点访问完毕。
如下图,从顶点1开始的深度优先遍历序列为12453(同一个顶点的邻接点按编号从小到大遍历)
显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯,在沿着另一条进行同样的遍历,直到所有顶点都被访问过为止。
程序实现
#include<iostream>
using namespace std;
int visit[101],count,n,g[101][101];
void dfs(int cur){
int i;
cout<<cur<<" ";
for(int i=1;i<=n;i++){
if(g[cur][i]==1 && visit[i]==0){
visit[i]=1;
dfs(i);
}
}
}
int main(){
int i,j,m,a,b;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
g[a][b]=1;
g[b][a]=1;
}
visit[1]=1;
dfs(1);
return 0;
}
广度优先搜索
- 从某一个顶点出发开始访问,被访问的顶点做相应的标记,输出访问顶点。
- 从被访问的顶点出发,搜索与该顶点有边的关联的某个未被访问的邻接点,并做相应标记。
- 再从根据2.中所有被访问的邻接点,访问与这些邻接点相关的未被访问的邻接点,直到所有顶点访问完为止。
如下图,从顶点1开始的深度优先遍历序列为12354(同一个顶点的邻接点按编号从小到大遍历)
程序实现
#include<iostream>
#include<queue>
using namespace std;
int visit[101],cnt,n,g[101][101];
int main(){
int i,j,m,a,b;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a>>b;
g[a][b]=1;
g[b][a]=1;
}
visit[1]=1;
queue<int> q;
cnt=1;
q.push(1);
cout<<1<<" ";
while(!q.empty() && cnt<n){
int cur=q.front();
for(int i=1;i<=n;i++){
if(g[cur][i]==1 && visit[i]==0){
cout<<i<<" ";
q.push(i);
cnt++;
visit[i]=1;
}
if(cnt>=n)
break;
}
q.pop();
}
return 0;
}