C++数据结构 23 图-深度优先搜索(DFS)

还是按邻接矩阵的图,使用深度优先搜索(DFS:使用堆栈)

 

#include <iostream>
#include <stack>
#define MAX_VERTS 20


using namespace std;
/**使用邻接矩阵来表示一个图**/
class Vertex
{
public:
    Vertex(char lab)
    {Label=lab;
     wasVisited=false;
    }
    bool wasVisited;   //检查是否被访问过
    char Label;
};

class Graph
{
public:
    Graph();
    ~Graph();
    void addVertex(char lab);
    void addEdge(int Start,int End);  //添加边
    void PrintMatrix(); //打印矩阵
    void showVertex(int v);
    void DFS();  //深度优先搜索
private:
    Vertex* vertexList[MAX_VERTS]; //最多顶点的数量
    int nVerts;     //实际数组顶点的数量
    int adjMat[MAX_VERTS][MAX_VERTS];  //举证
    int getAdjUnvisitedVertex(int v);
};

void Graph::DFS()  //深度优先搜索 使用堆栈
{
   stack<int> gStack;
   vertexList[0]->wasVisited=true;
   showVertex(0);
   gStack.push(0); //压入堆栈
   int v;
   while(gStack.size()>0)
   {
       v=getAdjUnvisitedVertex(gStack.top());
       if(v==-1)   //没有下一个
        gStack.pop();
       else{
            vertexList[v]->wasVisited=true;
            showVertex(v);
            gStack.push(v); //压入堆栈
       }
   }
   cout<<endl;
   for(int i=0;i<nVerts;i++)
     vertexList[i]->wasVisited=false;  //搜索完后重新设置为false 以便多次搜索
}
int Graph::getAdjUnvisitedVertex(int v)  //访问下一个
{
   for(int j=0;j<nVerts;j++)
   {
       if((adjMat[v][j]==1)&&(vertexList[j]->wasVisited==false))  //查看是否邻接的而且未被访问过的
       return j;
   }
   return -1;
}

void Graph::showVertex(int v)
{
    cout<<vertexList[v]->Label<<" ";
}
Graph::Graph()  //构造函数
{
  nVerts=0;
  for(int i=0;i<MAX_VERTS;i++)
        for(int j=0;j<MAX_VERTS;j++)
          adjMat[i][j]=0;   //全部初始化为0
}


void Graph::addVertex(char lab)
{
   vertexList[nVerts++]=new Vertex(lab);
}

void Graph::addEdge(int Start,int End) //增加一条边
{
  adjMat[Start][End]=1;
  adjMat[End][Start]=1;   //矩阵是对称的
}

void Graph::PrintMatrix()
{
  for(int i=0;i<nVerts;i++)
  {
      for(int j=0;j<nVerts;j++)
        cout<<adjMat[i][j]<<" ";
      cout<<endl;
  }
}
Graph::~Graph()
{
    for(int i=0;i<nVerts;i++)
        delete vertexList[i];
}
int main()
{
    Graph g;
    g.addVertex('A');
    g.addVertex('B');
    g.addVertex('C');
    g.addVertex('D');
    g.addVertex('E');

    g.addEdge(0,1);  //A-B
    g.addEdge(0,3);  //A-D
    g.addEdge(1,0);  //B-A
    g.addEdge(1,4);  //B-E
    g.addEdge(2,4);  //C-E
    g.addEdge(3,0);  //D-A
    g.addEdge(3,4);  //D-E
    g.addEdge(4,1);  //E-B
    g.addEdge(4,2);  //E-C
    g.addEdge(4,3);  //E-D
    g.PrintMatrix();
    cout << "DFS:" << endl;
    g.DFS();
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值