DFS只返回一个元素

时间:2011-10-16 11:30:00

标签: c++ graph-theory

这里是DFS算法,它只返回一个顶点,而不是ABCDE

#include <iostream>
using namespace std;

class Stack
{

private:
     static  const int size=20;
      int *st;
      int top;
public :
      Stack(){
    st =new int[size];
    top=-1;

      }
      ~Stack(){
          delete[] st;
          top=-1;
      }
      void push(int j){
          st[++top]=j;
              }
      int pop(){
          return st[top--];
      }
      int peek(){

          return st[top];

      }
       bool empthy(){
           return (top==-1);

       }
};
class Vertex{
public:
    char  label;
    bool visited;
public:
    Vertex(){

    }
    Vertex(char lab){
        label=lab;
        visited=false;

    }
    };
class Graph{
private:
static    const int maxvertex=20;
      Vertex* vertexlist;
      int **adj;
        int nverts;
        Stack *sstack;
public:
    Graph(){
    vertexlist=new Vertex[maxvertex]; 
    adj=new int*[maxvertex];
     for (int i=0;i<20;i++)
          adj[i]=new int[maxvertex];
     nverts=0;
      for (int i=0;i<maxvertex;i++){
           for (int j=0;j<maxvertex;j++){
               adj[i][j]=0;
           }
           }

         sstack=new Stack();
    }
    void add(char lab){

        vertexlist[nverts++] =  Vertex(lab);
    }
    void addedge(int i,int j){
        adj[i][j]=1;
        adj[j][i]=1;


    }
    void display(int v){
        cout<<vertexlist[v].label<<endl;

    }
    int getadjacent(int v){

         for (int j=0;j<nverts;j++){
             if (adj[v][j]==1 && vertexlist[j].visited==1){
                  return j;
             }


         }
         return -1;
    }
          void dfs(){
              vertexlist[0].visited=true;//mark it
              display(0);
                  sstack->push(0);
                  while(!sstack->empthy()){
                      int v=getadjacent(sstack->peek());
                      if (v==-1){ sstack->pop();}
                      else{
                          vertexlist[v].visited=true;
                      display(v);
                      sstack->push(v);
                      }
                  }


                   for (int j=0;j<nverts;j++){

                       vertexlist[j].visited=false;
                   }



          }



};
int main(){

    Graph *graph=new Graph();
    graph->add('A');
    graph->add('B');
    graph->add('C');
    graph->add('D');
    graph->add('E');
    graph->addedge(0,1);
    graph->addedge(1,2);
    graph->addedge(0,3);
    graph->addedge(3,4);
    cout<<" visits : ";
    graph->dfs();
    delete []graph;







    return 0;
}

它返回A,我的代码出了什么问题?请帮帮我

1 个答案:

答案 0 :(得分:1)

您在代码中遇到一些问题(例如,不要在使用delete[]创建的对象上使用new,它不是数组。)

但问题似乎是您的相邻定义需要vertexlist[j].visited==1,但我认为您的目的是寻找未访问的节点。所以你找不到任何与'A'相邻的节点,因为它们都没有被访问过。