深度优先遍历-DFS
深度优先遍历与深搜DFS相似,从一个点A出发,将这个点标为已访问visited[i]=true;,然后再访问所有与之相连,且未被访问过的点。当A的所有邻接点都被访问过后,再退回到A的上一个点(假设是B),再从B的另一个未被访问的邻接点出发,继续遍历。
算法框架:
void DFS ( Vertex V ){
visited[ V ] = true;
for ( V 的每个邻接点 W )
if ( !visited[ W ] )
DFS( W );
}
代码实现1-邻接矩阵存储
#include <iostream>
using namespace std;
int const MAXN=1000;
int G[MAXN][MAXN];
int visited[MAXN];
int m,n;
void dfs(int v){
visited[v]=true;
cout<<v<<' ';
for(int i=1;i<=n;i++) //访问当前节点的每个邻接节点
if(!visited[i]&&G[v][i]>0)
dfs(i);
}
int main(){
int u,v,cost;
cin>>m>>n;
for(int i=1;i<=m;i++){
cin>>u>>v>>cost;
G[u][v]=cost;
}
dfs(1);
return 0;
}
代码实现2-邻接表存储
#include <iostream>
using namespace std;
struct Edge{
int to;
int next;
int w; //边的权值
};
int const MAXN=1000;
int visited[MAXN];
int m,n;
Edge e[MAXN*2];
int head[MAXN];
int num=0;
void dfs(int v){
visited[v]=true;
cout<<v<<' ';
for(int i=head[v];i!=0;i=e[i].next) //访问当前节点的每条边
if(!visited[e[i].to]) //判断边所对应的邻接点是否被访问
dfs(e[i].to);
}
void addEdge(int from,int to,int w){
num++;
e[num].next=head[from];
e[num].to=to;
e[num].w=w;
head[from]=num;
}
int main(){
int u,v,cost;
cin>>m>>n;
for(int i=1;i<=m;i++){
cin>>u>>v>>cost;
addEdge(u,v,cost);
}
dfs(1);
return 0;
}
宽度优先搜索-BFS
BFS依靠队列实现,对节点层层扩展,具体过程可查看视频:https://www.bilibili.com/video/BV1oE41147rW
实现代码1-邻接矩阵存储
#include <iostream>
#include <queue>
using namespace std;
int const MAXN=1000;
int G[MAXN][MAXN];
int visited[MAXN];
int m,n;
queue<int > q;
void bfs(int v){
visited[v]=true;
cout<<v<<' ';
q.push(v);
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=1;i<=n;i++) //访问t的每个邻接点
if(!visited[i]&& G[t][i]>0)
{
visited[i]=true;
cout<<i<<' ';
q.push(i);
}
}
}
int main(){
int u,v,cost;
cin>>m>>n;
for(int i=1;i<=m;i++){
cin>>u>>v>>cost;
G[u][v]=cost;
}
bfs(1);
return 0;
}
实现代码2-邻接表存储
#include <iostream>
#include <queue>
using namespace std;
struct Edge{
int to;
int next;
int w; //边的权值
};
int const MAXN=1000;
int visited[MAXN];
int m,n;
Edge e[MAXN*2];
int head[MAXN];
int num=0;
queue <int> q;
void bfs(int v){
visited[v]=true;
cout<<v<<' ';
q.push(v);
while(!q.empty()){
int t=q.front();
q.pop();
for(int i=head[t];i!=0;i=e[i].next) //访问t的每个邻接点
if(!visited[e[i].to])
{
visited[e[i].to]=true;
cout<<e[i].to<<' ';
q.push(e[i].to);
}
}
}
void addEdge(int from,int to,int w){
num++;
e[num].next=head[from];
e[num].to=to;
e[num].w=w;
head[from]=num;
}
int main(){
int u,v,cost;
cin>>m>>n;
for(int i=1;i<=m;i++){
cin>>u>>v>>cost;
addEdge(u,v,cost);
}
bfs(1);
return 0;
}