DFS(深度优先遍历算法)C++

本文详细介绍了如何使用C++实现图的深度优先遍历算法(DFS)。通过实例代码,阐述了DFS的基本思想和操作过程,适用于图论和数据结构的学习者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

void matrix_make(Graph &g){ //由邻接表构造邻接矩阵 
	Arcnode *p = new Arcnode;
	memset(g.arc_matrix,0,sizeof(g.arc_matrix));
	for(int i = 1;i <= g.vex_sum;i++)
	{
		p = g.vexlist[i].firstarc;
		while(p){
			g.arc_matrix[i][p->adjvex] = 1;
			p = p->nextarc;
		}
	}
	for(int i = 1;i <= g.vex_sum;i++)
	for(int j = 1;j <= g.vex_sum;j++)
	if(g.arc_matrix[i][j] == 1)g.arc_matrix[j][i] = 1;
	
}
void dfs(Graph &g,int v){
	visit[v] = 1;
	cout<<g.vexlist[v].data<<endl;
	for(int i = 1;i <= g.vex_sum;i++)
	{
		if(g.arc_matrix[i][v] == 1 && visit[i] == 0)dfs(g,i);
	}
	
}
void dfs_travel(Graph &g){
	for(int i = 1;i <= g.vex_sum;i++)visit[i] = 0;
	for(int i = 1;i <= g.vex_sum;i++)//对于连通图没有实际意义对于非连通图有查漏作用 
	if(!visit[i])dfs(g,i); 
}

 

完整代码:

### C++ DFS 深度优先遍历算法邻接表实现 #### 使用邻接表表示图并执行深度优先搜索 为了使用邻接表来实现DFS,程序通常定义一个类`Graph`用于创建和管理图的数据结构。在这个例子中,图中的每一个顶点都关联着一个链表,用来保存相邻的顶点列表。 ```cpp #include <iostream> #include <list> using namespace std; class Graph { int V; // 顶点数量 list<int> *adj; // 邻接表指针数组 public: Graph(int V); // 构造函数 void addEdge(int v, int w); // 添加边 void DFS(int v); // 执行DFS从给定起点开始 private: void DFSUtil(int v, bool visited[]); // 辅助递归函数 }; Graph::Graph(int V) { this->V = V; adj = new list<int>[V]; } void Graph::addEdge(int v, int w) { adj[v].push_back(w); // 向v对应的链表添加w } // 定义辅助递归函数来进行实际的DFS操作 void Graph::DFSUtil(int v, bool visited[]) { // 标记当前节点为已访问,并打印出来 visited[v] = true; cout << v << " "; // 获取所有相邻顶点并将未访问过的顶点作为新的起始位置继续深入探索 list<int>::iterator i; for (i = adj[v].begin(); i != adj[v].end(); ++i) if (!visited[*i]) DFSUtil(*i, visited); } // 公共接口方法启动DFS过程 void Graph::DFS(int v) { // 初始化所有的顶点状态为未访问过 bool *visited = new bool[V]; for (int i = 0; i < V; i++) visited[i] = false; // 调用私有的递归帮助器函数完成具体工作 DFSUtil(v, visited); delete[] visited; // 清理分配的空间 } ``` 这段代码展示了如何构建基于邻接表的无向图以及怎样运用递归来实施深度优先搜索[^2]。当调用`DFS()`时,传入想要开始遍历的第一个顶点编号即可触发整个流程;而内部则依靠`DFSUtil()`不断迭代直至无法再前进为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值