1 DFS
1.1 邻接矩阵版
const int maxv=1000; //最大顶点数
const int inf=1000000000; //设inf为一个很大的数
//邻接矩阵版
int n,g[maxv][maxv]; //n为顶点数,maxv为最大顶点数
bool vis[maxv]={false}; //如果顶点i被访问,则vis[i]==true,初始为false
void dfs(int u,int depth){ //u为当前访问的顶点标号,depth为深度
vis[u]=true;
for(int v=0;v<n;v++){
if(vis[v]==false&&g[u][v]!=inf){
dfs(v,depth+1);
}
}
}
void dfstrave(){ //遍历图g
for(int u=0;u<n;u++){
if(vis[u]==false){
dfs(u,1);
}
}
}
1.2 邻接表版
//邻接表版
vector<int> adj[maxv];
void dfs2(int u,int depth){
vis[u]=true;
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
if(vis[v]==false)
dfs2(v,depth+1);
}
}
void dfstrave2(){
for(int u=0;u<n;u++){
if(vis[u]==false)
dfs2(u,1);
}
}
2 BFS
2.1 邻接矩阵版
const int maxv=1010;
const int inf=1000000000;
//邻接矩阵版
int n,g[maxv][maxv];
bool inq[maxv]={false};
void bfs(int u){
queue<int> q; //定义队列q
q.push(u); //将初始点u入队
inq[u]=true; //设置u已被加入过队列
while(!q.empty()){ //只要队列是非空
int u=q.front(); //取出队首元素
q.pop(); //将队首元素出队
for(int v=0;v<n;v++){
if(inq[v]==false&&g[u][v]!=inf){
//如果u的邻接点v未曾加入过队列
q.push(v); //将v入队
inq[v]=true; //标记v已入队
}
}
}
}
void bfstrave(){
for(int u=0;u<n;u++){ //枚举所有顶点
if(inq[u]==false) //如果u未入队
bfs(u); //遍历u所在的连通块
}
}
2.2 邻接表版
//邻接表版
vector<int> adj[maxv];
void bfs2(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 bfstrave2(){
for(int u=0;u<n;u++){
if(inq[u]==false)
bfs2(u);
}
}