一、DFS遍历图(领接矩阵存储)
#include<cstdio.h>
const int MAXV = 1000;//最大定点数
const int INF = 1000000000;//设置INF为一个很大的数
int n,G[MAXV][MAXV];//n为顶点数
bool vis[MAXV]={false};//如果顶点i被访问,则为true
void DFS(int u , int depth){
vis[u] = true;
//如果需要对顶点u进行操作,可以在这里进行
//下面对所有从u能够到达的分支节点进行枚举
for(int v = 0 ; v < n ; v++){
if(vis[v]==false&&G[u][v]!=INF){
DFS(v,depth+1);//访问v,深度+1
}
}
}
void DNSTrave(){
for(int u = 0 ; u < n ; u++){
if(vis[u]==false){
DFS(u,1);
}
}
}
二、DFS遍历图(领接表存储)
const int MAXV = 1000;
const int INF = 1000000000;
vector<int> Adj[MAXN];//图G的邻接表
int n;//顶点数
bool vis[MAXN] = {false};
void DFS(int u , int depth){
vis[u] = true;
//如果要对u进行一些操作,可以在此执行
for(int i = 0 ; i < Adj[u].size(); i++){
int v = Adj[u][i];
if(vis[v] == false){
DFS(v,depth+1);
}
}
}
void DFSTrave(){
for(int u = 0 ; u < n ; u++){
if(vis[u] == false){
DFS(u,1);
}
}
}
三、BFS遍历图(领接矩阵)
int n , G[MAXV][MAXV];
bool inq[MAXV] = {false};
void BFS(int u){
queue<int> q;
q.push(u);
inq[u] = true;
while(!q.empty()){
int u = q.front();
q.pop();
for(int v = 0 ; v < n ; v++){
if(inq[v] == false && G[u][v]!=INF){
q.push(v);
inq[v] = true;
}
}
}
}
void BFSTrave(){
for(int u = 0 ; u < n ; u++){
if(inq[u] == false){
BFS(u);
}
}
}
四、BFS遍历图(邻接表)
vector<int> Adj[MAXV];
int n;
bool inq[MAXV] = {false};
void BFS(int u){
queue<int> q;
q.push(u);
inq[u] = true;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = 0 ; i < Adj[u].size() ; i++){
int v = Adj[u][i];
if(inq[v] == false){
q.push(v);
inq[v] = true;
}
}
}
}
void BFSTrave(){
for(int u = 0 ; u < n ; u++){
if(inq[u] == false){
BFS(u);
}
}
}