C++ 邻接矩阵的深度优先搜索
对于这个程序,我得到了一组需要存储在邻接矩阵中的输入。我已经这样做了,所以我有一个邻接矩阵[11][11]。现在,使用这个矩阵,我需要执行深度优先搜索并返回pi值 我有这方面的伪代码,所以我相信我需要两种方法:DFS(图形)和DFS-VISIT(节点)。然而,我在实际实现这一点上遇到了困难。我可以直接使用邻接矩阵来实现这一点,还是需要使用矩阵创建一个图形?如果您能帮助我们编写代码,我们将不胜感激C++ 邻接矩阵的深度优先搜索,c++,algorithm,depth-first-search,adjacency-matrix,C++,Algorithm,Depth First Search,Adjacency Matrix,对于这个程序,我得到了一组需要存储在邻接矩阵中的输入。我已经这样做了,所以我有一个邻接矩阵[11][11]。现在,使用这个矩阵,我需要执行深度优先搜索并返回pi值 我有这方面的伪代码,所以我相信我需要两种方法:DFS(图形)和DFS-VISIT(节点)。然而,我在实际实现这一点上遇到了困难。我可以直接使用邻接矩阵来实现这一点,还是需要使用矩阵创建一个图形?如果您能帮助我们编写代码,我们将不胜感激 DFS(G) for each u ∈ V[G] do color[u] =
DFS(G)
for each u ∈ V[G] do
color[u] = WHITE
∏[u] = NIL
time = 0
for each u ∈ V[G] do
if color[u] = WHITE then
DFS-VISIT(u)
DFS-VISIT(u)
color[u] = GRAY
time++
d[u] = time
for each v ∈ Adj[u] do
if color[v] = WHITE then
∏[v] = u
DFS-VISIT(v)
color[u] = BLACK
time++
f[u] = time
这里的伪代码似乎采用了邻接列表 具体而言,此代码:(假定对应于代码块的缩进) 不同之处在于:对于邻接矩阵,所有顶点都存在,并且通常使用0/1标志指示当前顶点和目标顶点之间是否存在边 因此,您应该循环遍历邻接矩阵中该行的所有顶点,并且仅在标志设置为1时执行操作 这部分伪代码将类似于:
for v = 1 to n do // assuming 1-indexed
if color[v] = white && AdjMatrix[u][v] == 1 then
∏[v] = u
DFS-VISIT(v)
据我所知,psuedo代码的其余部分看起来应该是相同的。一般来说,最好将DFS编码为假定图形表示为邻接列表,因为结果的时间复杂度是
O(| V |+| E |)
。但使用邻接矩阵时,时间复杂度变为O(|V |*|V |)
。下面是假设邻接矩阵表示的dfs实现:
#define WHITE 0
#define GRAY 1
#define BLACK 2
int time_;
vector<int> color(n, WHITE), par(n, 0), strt(n, 0), fin(n, 0);
vector<vector<int> > G(n, vector<int>(n, 0));
void dfs_visit(int);
void DFS(){
for(int i = 0; i < n; i++)
color[i] = 0, par[i] = -1;
time = 0;
for(int j = 0; j < n; i++)
if(color[j] == WHITE)
dfs_visit(j);
}
}
void dfs_visit(int u){
time_++;
strt[u] = time_;
color[u] = GRAY;
for(int v = 0; v < n && v++)
if(G[u][v] && color[v] == WHITE){
par[v] = u;
dfs_visit(v);
}
color[u] = BLACK;
time_++;
fin[u] = time_;
}
#定义白色0
#定义灰色1
#定义黑色2
国际时间(int time);;
矢量颜色(n,白色)、par(n,0)、strt(n,0)、鳍(n,0);
向量G(n,向量(n,0));
取消探访(国际);;
void DFS(){
对于(int i=0;i
par[]矩阵计算每个顶点的父节点,strt[]和fin[]矩阵计算顶点的时间戳。顶点是基于0编号的 这可以通过邻接矩阵单独完成。“pi”值是什么意思?请显示部分代码。您的图形就是矩阵。请发布DFS(g)函数的简化版本。此矩阵是图形的表示形式,因此您不需要生成另一个数据结构。但是,可能需要更多存储来将节点标记为“已访问”或“未访问”;然而,这取决于图的类型和算法的实际应用。节点将通过行的索引进行转换(例如),循环“对于节点i的每个邻居”将通过循环“对于每个索引j”进行转换,以使mat[i][j]为正”
#define WHITE 0
#define GRAY 1
#define BLACK 2
int time_;
vector<int> color(n, WHITE), par(n, 0), strt(n, 0), fin(n, 0);
vector<vector<int> > G(n, vector<int>(n, 0));
void dfs_visit(int);
void DFS(){
for(int i = 0; i < n; i++)
color[i] = 0, par[i] = -1;
time = 0;
for(int j = 0; j < n; i++)
if(color[j] == WHITE)
dfs_visit(j);
}
}
void dfs_visit(int u){
time_++;
strt[u] = time_;
color[u] = GRAY;
for(int v = 0; v < n && v++)
if(G[u][v] && color[v] == WHITE){
par[v] = u;
dfs_visit(v);
}
color[u] = BLACK;
time_++;
fin[u] = time_;
}