深度优先搜索邻接矩阵

时间:2014-04-17 08:21:12

标签: c++ algorithm depth-first-search adjacency-matrix

对于这个程序,我需要一组输入,我需要存储在一个邻接矩阵中。我已经这样做了,所以我有一个邻接矩阵矩阵[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

2 个答案:

答案 0 :(得分:0)

你在那里的伪代码似乎假设了一个邻接列表。

特别是这段代码:(对应于假定的代码块的缩进)

for each v ∈ Adj[u] do 
  if color[v] = white then 
    ∏[v] = u 
    DFS-VISIT(v) 

不同之处在于:使用邻接矩阵,所有顶点都在那里,并且通常使用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) 

据我所知,伪代码的其余部分应该看起来完全相同。

答案 1 :(得分:0)

通常,首选代码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_;
}

par []矩阵计算每个顶点的父节点,strt []和fin []矩阵为顶点添加时间戳。顶点从0开始编号。