图的DFS遍历

点击查看代码
#include<cstdio>
#include<vector>
using namespace std;
#pragma warning(disable:4996)

const int maxn = 100; //最多有100个顶点
const int INF = 1000000; //INF是一个很大的数,表示两个顶点之间不相连

//1、图的DFS遍历(邻接表存储图)
vector<int> Adj[maxn]; //邻接表,Adj[i]存储所有与顶点i相连的顶点编号
int n; //顶点个数
bool vis[maxn] = { false }; //记录顶点是否已被访问,vis[i]=true表示已访问

void DFS(int u, int depth) { //用DFS遍历当前顶点u,depth是递归深度
	vis[u] == true; //设置顶点u已被访问

	/* 编写对顶点u的相关操作代码,如输出u */
	
	//枚举u的所有相邻点,对每个相邻点进行访问
	for (int i = 0; i < Adj[u].size(); i++) {
		int v = Adj[u][i]; //为了方便书写,将顶点编号Adj[u][i]存入变量v中 
		if (vis[v] == false) { //如果顶点v未被访问
			DFS(v, depth + 1); //则递归访问顶点v,深度加一
		}
	}
}

//用DFS遍历图G
void DFSTrave() { 
	for (int u = 0; u < n; u++) { //枚举所有顶点
		if (vis[u] == false) { //如果顶点u未被访问
			DFS(u, 1); //则递归访问顶点u所在的连通块,深度为1表示第一层
		}
	}
}

//2、图的DFS遍历(邻接矩阵存储图)
int n, G[maxn][maxn]; //顶点个数,邻接矩阵
bool vis[maxn] = { false }; //记录顶点是否已被访问,vis[i]=true表示已访问

//用DFS遍历当前顶点u,depth是递归深度
void DFS(int u, int depth) { 
	vis[u] = true; //顶点u已被访问设为true
	
	/* 编写对顶点u的相关操作代码,如输出u */

	//枚举u的所有相邻点,对每个相邻点进行访问
	for (int v = 0; v < n; v++) {
		//如果顶点v未访问,且顶点u和v之间相连
		if (vis[v] == false && G[u][v] != INF) {
			DFS(v, depth + 1); //则递归访问顶点v,深度加一
		}										
	}
}

//用DFS遍历图G
void DFSTrave() { 
	for (int u = 0; u < n; u++) { //枚举所有顶点u
		if (vis[u] == false) { //如果顶点u未被访问
			DFS(u, 1); //则递归访问顶点u所在的连通块,深度为1表示第一层
		}
	}
}	

posted @ 2022-09-30 21:14  zhaoo_o  阅读(32)  评论(0编辑  收藏  举报