深度优先遍历:
算法步骤(递归):
①初始化图中所有顶点未被访问
②从图中的某个顶点v出发,访问v并标记已访问
③依次检查v的所有邻接点w,如果w未被访问,则从w出发进行深度优先遍历,重复②和③
Code:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int N,M;
vector<vector<int>>Edge;//创建邻接表
vector<bool>visit;//存储标志
void DFS(int x){
visit[x]=true;
cout<<x<<" ";
for(int i=0;i<Edge[x].size();i++)
if(!visit[Edge[x][i]])
DFS(Edge[x][i]);
}
int main(){
cin>>N>>M;
Edge.resize(N+1);
visit.resize(N+1);
for(int i=1;i<=M;i++){
int a,b;
cin>>a>>b;
Edge[a].push_back(b);
Edge[b].push_back(a);
}
cout<<"深搜顺序:"<<endl;
DFS(1);
return 0;
}
//测试数据
//8 9
//1 2
//1 3
//2 4
//2 5
//2 6
//3 7
//3 8
//4 5
//7 8
广度优先遍历:
算法步骤:
①初始化图中所有顶点未被访问,初始化一个空队列
②从图中的某个顶点v出发,访问v并标记已访问,将v入队
③如果队列非空,则继续执行,否则算法结束
④队头元素v出队,依次访问v的所有未被访问邻接点,标记已访问并入队,转向③
Code:
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int N,M;
vector<vector<int>>Edge;//创建邻接表
vector<bool>visit;//存储标志
void BFS(int x){
queue<int>Q;//创建队列
Q.push(x);//入队
visit[x]=true;//标记已访问
int T;
while(!Q.empty()){//判断队列是否为空
T=Q.front();//找出队头元素
cout<<T<<" ";
Q.pop();//弹出
for(int i=0;i<Edge[T].size();i++){
if(!visit[Edge[T][i]]){//节点未被访问
Q.push(Edge[T][i]);//入队
visit[Edge[T][i]]=true;//标记为已访问
}
}
}
}
int main(){
cin>>N>>M;
Edge.resize(N+1);
visit.resize(N+1);
for(int i=1;i<=M;i++){
int a,b;
cin>>a>>b;
Edge[a].push_back(b);
Edge[b].push_back(a);
}
cout<<"广度优先遍历:"<<endl;
BFS(1);
return 0;
}
//测试数据
//8 9
//1 2
//1 3
//2 4
//2 5
//2 6
//3 7
//3 8
//4 5
//7 8