(12.18)无向图的深度搜索(邻接矩阵)

深度搜索:DFS,就是从其中一个顶点v开始,,访问顶点,然后,从v开始往一个方向搜索,直到遇到的下一个搜索目标是已经搜索过的,然后返回上一个结点,判断有没有结点是没有被搜索过的,若没有,继续返回上一层,直到所有的都被访问完。


先用邻接矩阵写一遍
(12.18)无向图的深度搜索(邻接矩阵)_第1张图片

贴下代码:

#include<iostream>
using namespace std;
const int vertex_max = 20//初始设定顶点的最大值为20 
struct Graph
{
  char vertex [ vertex_max ];   //建立顶点表
  int arc [ vertex_max ][ vertex_max ];   //邻接矩阵
  int vertexnum , arcnum;   //顶点个数,边个数
};

void CreatGraph( Graph & G)
{
  int i , j , k , w; //w是权值
  cout << "请输入顶点个数和边的个数:" << endl;
  cin >> G . vertexnum >> G . arcnum;
  cout << "请依次输入顶点的信息:" << endl;
  for( i = 0 ; i < G . vertexnum ; i ++)
      cin >> G . vertex [ i ];
  for( i = 0 ; i < G . vertexnumi ++)           //初始化邻接矩阵
      for( j   = 0 ; j < G . vertexnumj ++)
      {
          if( i == j)
              G . arc [ i ][ j ] = 0;
          else
          G . arc [ i ][ j ] = INT_MAX;
      }
  cout << "请输入边(Vi,Vj)的下标i,j和权值:" << endl;
  cout << endl;
  cout << "                 i   j   weight " << endl;
  for( k = 0 ; k < G . arcnum ; k ++)
  {
      cout << "请输入第" << k + 1 << "条边的信息:";
      cin >> i >> j >> w;
      G . arc [ i ][ j ] = w;
      G . arc [ j ][ i ] = G . arc [ j ][ i ];
  }
  cout << "creatsuccessful!" << endl;
}


bool visted [ vertex_max ];     //访问标志的数组

void DFS( Graph G , int i)
{
    int j;
    visted [ i ] = true;
    cout << G . vertex [ i ] << " ";
    for( j = 0 ; j < G . vertexnum ; j ++)
    {
        if( G . arc [ i ][ j ] == 1 && ! visted [ j ])
            DFS( G , j);          
    }
}


void DFSTraverse( Graph G)
{
    int i;
    for( i = 0 ; i < G . vertexnum ; i ++)
        visted [ i ] = false;                        //初始化所有结点都为未访问状态
    for( i = 0 ; i < G . vertexnumi ++)
    {
        if( ! visted [ i ])
            DFS( G , i);
    }
}

int main()
{
    Graph G;
    CreatGraph( G);
    cout << "DFS遍历此无向图:" << endl;
    DFSTraverse( G);
    cout << endl;
}


(12.18)无向图的深度搜索(邻接矩阵)_第2张图片





你可能感兴趣的:((12.18)无向图的深度搜索(邻接矩阵))