目录:
深度优先搜索概念
图的表示方法
遍历图上所有节点
实例
深度优先搜索概念:
在图上寻找路径
从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了了就回退‘=>’,此种路径搜索策略就称为“深度优先搜索”。
简称“深搜”。
一.图的表示方法——邻接表
1)用邻接矩阵,一个二维数组G存放图,G[i][j]表示节点i和节点j之间边的情况
(如有无边,边方向,权值大小等)。
复杂度(n^2)
2)用邻接表,每个节点V对应一个一维数组(vector),里面存放从V连出去的边
,边的信息包括另一顶点,还可能包含边权值等。
复杂度(n+e)
二.遍历图上所有节点
#include<bits/stdc++.h>
using namespace std;
Dfs(V)
{
if(V是旧点)
return;
将V标记为旧点;
对和V相邻的每个点U{
Dfs(U);
}
}
int main()
{
将所有点都标记为新点;
while(在图中能找到新点k)
if(Dfs(起点)){
Dfs(k);
}
}
三.实例
一)判断从V出发是否能走到终点:
#include<bits/stdc++.h>
using namespace std;
//判断从V出发是否能走到终点:
bool Dfs(v){
if(V为终点)
return ture;
if(V为旧点)
return false;
将V标记为旧点;
对和V相邻的每个节点U{
if(Dfs(U)==ture)
return ture;
}
return false;
}
int main()
{
将所有点都标记为新点;
起点=1;
终点=8;
cout<<Dfs(起点);
}
二)判断从V出发是否能走到终点,如果能,要记录路径:
#include<bits/stdc++.h>
using namespace std;
Node path[MAX_LEN]; //MAX_LEN取节点总数即可
int depth; //记录深度,走了多少步
boolDfs(V){
if(V为终点){
path[depth]=V; //记录
return true;
}
if(V为旧点)
return false;
将V标记为旧点; //否则V是新点的话,将V标记为旧点,继续搜索
path[depth]=V; //记录
++depth; //深度加1
对和V相邻的每个节点U{
if(Dfs(U)==ture)
return ture;
}
--depth; //将放在数组中的V给删掉
return false;
}
int main()
{
将所有点都标记为新点;
depth=0;
if(Dfs(起点)){
for(int i=0;i<=depth;++i)
cout<<path[i]<<endl;
}
}