#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int MAXN = 7; bool visit1[MAXN] = {0}; int ans[100],ansSize=0; int adj[MAXN][MAXN] = { {0,1,1,0,0,0,0}//adj[0][0-6] {1,0,0,1,1,0,0}//adj[1][0-6] {1,0,0,0,0,1,1}//adj[2][0-6] {0,1,0,0,0,0,0}//adj[3][0-6] {0,1,0,0,0,1,0}//adj[4][0-6] {0,0,1,0,1,0,0}//adj[5][0-6] {0,0,1,0,0,0,0}//adj[6][0-6] }//邻接矩阵 void dfs_add(int u){ ans[ansSize++]=u; } void dfs(int u){ if(visit1[u]){ return ;//无返回值类型 } visit1 [u]=1; dfs_add(u) for(int i = 0;i<MAXN;++i){ int v = 1; if(adj[u][v]){ dfs(v); } } } int main(){ //略 return 0; }
1.visit1[MAXN]数组是一个bool数组,用来标记某个节点是否被访问,初始化位false;已经访问过的节点执行回溯。
2.visit1[u]=true;对未访问节点U标记为访问状态。
3.dfs_add(u);用来存储到U节点的访问。函数实现:void dfs_add(int u){ ans[ansSize++]=u; }
4.adj[MAXN][MAXN]是图的邻接矩阵,用0||1来代表点是否联通;函数如下:int adj[MAXN][MAXN] = { {0,1,1,0,0,0,0}//adj[0][0-6] {1,0,0,1,1,0,0}//adj[1][0-6] {1,0,0,0,0,1,1}//adj[2][0-6] {0,1,0,0,0,0,0}//adj[3][0-6] {0,1,0,0,0,1,0}//adj[4][0-6] {0,0,1,0,1,0,0}//adj[5][0-6] {0,0,1,0,0,0,0}//adj[6][0-6] }//邻接矩阵
"adj[u][v]=1"代表u和v之间存在一条边;"adj[u][v]=0"代表u和v之间不存在边;
深度优先搜索(Depth-First Search,简称DFS)原理:
简介{
DFS是图遍历的一种,用一句话说就是“一直往下走,走不通就回头,换路再走,直到无路可走”;
(走过的路坐标记);}
具体算法描述:
选择一个起始点(U)作为当前节点,执行操作;{
a.访问当前节点,并标记当前节点被访问,然后跳到b;
b. 如果存在一个和当前节点相邻,并且尚未访问的节点(U);则,将U设为当前节点,继续执行a;
c.如果不存在这样的节点(U),则进行回溯,回溯过程就是回退当前节点;}
上述所说的当前节点需要使用栈来维护,每次访问新的节点加入栈,回溯的时候就出站;
例如:给定一个n个节点的的无向图,要求访问到的节点入栈,回溯的时候出栈,求输出整个过程的遍历序列;
便利规则{
1.如果当前节点已被访问,则不能再访问;
2.每次从当前节点到相邻界点中寻找一个编号最小的没有访问的节点进行访问;
}
举例{
假设我们有以下图{A / \ B C / \ \ D E F
}
遍历过程{
从节点A开始进行DFS遍历,按照深度优先的方式遍历图中的节点。我们使用字母表示节点。
•从节点A开始,标记A为已访问。
•探索A的邻居节点,按照字母顺序选择,首先选择B。
•进入节点B,标记B为已访问。
•探索B的邻居节点,选择D。进入节点D,标记D为已访问。
•D没有其他邻居节点,回溯到上一个节点B。
•探索B的下一个邻居节点,选择E。进入节点E,标记E为已访问。
•E没有其他邻居节点,回溯到上一个节点B。
•B没有其他邻居节点,回溯到上一个节点A。
•探索A的下一个邻居节点,选择C。进入节点C,标记C为已访问。
•探索C的邻居节点,选择F。进入节点F,标记F为已访问。
•F没有其他邻居节点,回溯到上一个节点C。
•C没有其他邻居节点,回溯到上一个节点A。
•A没有其他邻居节点,DFS遍历结束。
在以上示例中,DFS遵循深度优先的原则,尽可能深
}
}
、、、