5.1.1图的深度优先遍历

#include<iostream>
#include<cstdio>
using namespace std;
int book[101],sum,n,e[101][101];
void dfs(int cur){//cur是当前所在的顶点编号
	int i;
	cout<<cur<<" ";
	sum++;//每访问一个顶点,sum就加1
	if(sum==n){
		return;//所有的顶点都已经访问过则直接退出 
	} 
	for(i=1;i<=n;i++){//从1号顶点到n号顶点依次尝试,看哪些顶点与当前顶点cur有边相连 
		//判断当前顶点cur到顶点i是否有边,并判断顶点i是否已访问过
		if(e[cur][i]==1&&book[i]==0){
			book[i]=1;//标记顶点i已经访问过
			dfs(i);//从顶点i再出发继续遍历 
		} 
	} 
	return; 
} 
int main(){
	int i,j,m,a,b;
	cout<<"请输入n m"<<endl<<"表示有n个结点,共有m条边:"<<endl;
	cin>>n>>m;
	//初始化二维矩阵
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			if(i==j){
				e[i][j]=0;
			}
			else{
				e[i][j]=99999999;//我们这里假设99999999为正无穷 
			}
		}
	} 
	
	cout<<"请输入a b,表示结点a和结点b之间有边:"<<endl;
	//读入顶点之间的边 
	for(i=1;i<=m;i++){
		cin>>a>>b;
		e[a][b]=1; 
		e[b][a]=1;//这里是无向图,所以e[b][a]也赋值为1 
	} 
		
	//显示原始图的抽象矩阵
	cout<<endl<<"原始图对应的抽象矩阵为:"<<endl;//n个结点,形成n*n二维矩阵 
	for(i=1;i<=n;i++){
		for(j=1;j<=n;j++){
			printf("%10d",e[i][j]);
			if(j==n){
				cout<<endl;
			}
		}
	} 
	cout<<endl<<endl<<"使用深度优先搜索的访问顺序为:";
	//从1号结点出发
	book[1]=1;//标记1号已访问 
	dfs(1);//从1号顶点开始遍历 
	
	return 0;
}

/*
	深度优先搜索核心思想为:
		首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有
	未访问过的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。 
		显然,深度优先遍历是沿着图的某一条分支遍历直到末端,然后回溯到上一级,再沿着另一
	条进行同样的遍历,直到所有的顶点都被访问过为止。 
*/

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/shaguabufadai/article/details/62041565
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞