Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 邻接矩阵的深度优先搜索_C++_Algorithm_Depth First Search_Adjacency Matrix - Fatal编程技术网

C++ 邻接矩阵的深度优先搜索

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] =

对于这个程序,我得到了一组需要存储在邻接矩阵中的输入。我已经这样做了,所以我有一个邻接矩阵[11][11]。现在,使用这个矩阵,我需要执行深度优先搜索并返回pi值

我有这方面的伪代码,所以我相信我需要两种方法:DFS(图形)和DFS-VISIT(节点)。然而,我在实际实现这一点上遇到了困难。我可以直接使用邻接矩阵来实现这一点,还是需要使用矩阵创建一个图形?如果您能帮助我们编写代码,我们将不胜感激

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_;
}