邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历

转载 2015年11月19日 09:55:03

图的两种存储方式:邻接矩阵和邻接表;
两种遍历方式:深度优先和广度优先;

首先以一个结构体存储一个图:

struct MGraph
{
 int vertex[maxvertex];          //存顶点
 int arc[maxvertex][maxvertex];  //存边(邻接矩阵)
 int vertexnum,arcnum;           //顶点数和边数
};

其次是对图的初始化:

void CreatMGraph(MGraph *&G)
{
 int i,j;
 cin1>>G->vertexnum>>G->arcnum;  //输入顶点数和边数

 for(i=0;i<G->vertexnum;i++)  //输入每个顶点的值
    cin1>>G->vertex[i];
 for(i=0;i<G->vertexnum;i++)  //初始化邻接矩阵
   for(j=0;j<G->vertexnum;j++)
      G->arc[i][j]=0;

 for(i=0;i<G->arcnum;i++)  
 {
    int n,m,w;
    cin1>>n>>m>>w;    //修改邻接矩阵中的值
    G->arc[n][m]=w;
    G->arc[m][n]=w;
 }
}

在此之前需要定义一个全局变量的visited数组:

int visited[maxvertex];   //标记已被访问过的顶点(全局变量)

//广度优先遍历
void BFS(MGraph *&G,int v)
{
 queue<int> q;
 int x,j;
 if(!visited[v]) //即为visited[v]==0,也就是未被访问过
 {
  cout<<G->vertex[v]<<" ";
  visited[v]=1;
  q.push(v); //被访问的顶点入队
 }
 while(!q.empty()) //队不空进循环
 {
  x=q.front(); //取队头元素
  q.pop();  //队头出队
  for(j=0;j<G->vertexnum;j++)
   if (G->arc[x][j]&&!visited[j])
   {
    cout<<G->vertex[j]<<" ";
    visited[j]=1; //标记为访问过
    q.push(j);   //被访问的顶点继续入队
   }
 }
}

//深度优先遍历
void DFS(MGraph *&G,int v)
{
nt j;
 if(!visited[v]) 
 {
  cout<<G->vertex[v]<<" ";
  visited[v]=1; //标记为访问过
 }
 for(j=0;j<G->vertexnum;j++) 
  if (G->arc[v][j]&&!visited[j])//邻接矩阵的第(v,j)元素不为0
  {                             //且未被访问过则递归
   DFS(G,j);
  }
}

此为图的邻接矩阵的输出函数:

void Print(MGraph *G)
{
 int i,j;
 for(i=0;i<G->vertexnum;i++)
 {
  for(j=0;j<G->vertexnum;j++)
   cout<<G->arc[i][j]<<" ";
  cout<<endl;
 }
}

main函数调用上面函数:

int main()
{
 MGraph *G=new MGraph;
 CreatMGraph(G);

 cout<<"输出邻接矩阵:"<<endl;
 Print(G);

 cout<<"深度优先搜索:";
 DFS(G,0);
 cout<<endl;

 memset(visited,0,sizeof(visited));//非常重要!!在下一个搜索之前一定要将标志位全部重新赋值为0
 cout<<"广度优先搜索:";
 BFS(G,0);
 cout<<endl;

 return 0;
}

邻接矩阵深度优先和广度优先遍历(DFS和BFS)

/*邻接矩阵的广度遍历算法*/ #include "stdio.h" #include "stdlib.h" #define OK 1 #define ERROR 1 #define FALSE 0...
  • u012257743
  • u012257743
  • 2014年07月06日 16:28
  • 2936

无向图的广度优先遍历---邻接矩阵实现

基本思想: 1、从图中某个顶点V0出发,并访问此顶点; 2、从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点; 3、重复步骤...
  • cjc211322
  • cjc211322
  • 2014年03月20日 22:26
  • 1726

【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历

转载地址:http://blog.csdn.net/e_one/article/details/50624141 假设有以下结构的图: 用邻接矩阵表示如下: ...
  • l_215851356
  • l_215851356
  • 2017年04月11日 13:44
  • 1986

【数据结构】邻接矩阵表示法的图的深度广度优先遍历递归和非递归遍历

假设有以下结构的图: 用邻接矩阵表示如下: 因为他是无向图,我们可以发现他的矩阵是对角对称的。矩阵中每一行每一列都可以看成是一个顶点,矩阵中的元素表示着该顶点与其他顶点的关系,当元素的值为1说明...
  • e_one
  • e_one
  • 2016年02月02日 16:26
  • 7710

邻接矩阵的深度优先遍历(递归以及非递归),广度优先遍历

#include #include #define MAX_VERTEX_NUM 20 typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]...
  • i1020
  • i1020
  • 2016年11月13日 17:24
  • 1514

C++编程练习(9)----“图的存储结构以及图的遍历“(邻接矩阵、深度优先遍历、广度优先遍历)

图的存储结构 1)邻接矩阵 用两个数组来表示图,一个一维数组存储图中顶点信息,一个二维数组(邻接矩阵)存储图中边或弧的信息。 2)邻接表 3)十字链表 4)邻接多重表 5)边集数组 本文只用代码实现用...
  • oohaha_123
  • oohaha_123
  • 2014年04月03日 19:44
  • 2770

图的邻接表存储表示 图的深度优先遍历和图的广度优先遍历

#include #include #define MAX_VERTAX_SIZE 20 #define OK 1 #define ERROR 0 typedef int Status; type...
  • robin_Xu_shuai
  • robin_Xu_shuai
  • 2016年03月13日 15:30
  • 5773

c语言编程 输出一个无向图的邻接表,邻接矩阵,进行深度和广度优先遍历

#include #include #include #include #define MAXVERTEX 10 //最大顶点数 typedef struct ArcNode //表结...
  • liuzhuchen
  • liuzhuchen
  • 2014年03月19日 23:42
  • 4361

图的邻接矩阵存储表示 深度优先和广度优先遍历

#include #include #define OK 1 #define ERROR 0 #define MAX_VERTAX_SIZE 20 typedef char VerElemType...
  • robin_Xu_shuai
  • robin_Xu_shuai
  • 2016年03月13日 15:26
  • 4848

图的深度优先遍历和广度优先遍历

1.深度优先遍历(DFS) (1)从某个顶点V出发,访问顶点并标记为已访问 (2)访问V的邻接点,如果没有访问过,访问该顶点并标记为已访问,然后再访问该顶点的邻接点,递归执行      如果该顶点已访...
  • lom9357bye
  • lom9357bye
  • 2015年06月23日 13:01
  • 13170
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:邻接矩阵存储的无向图深度优先(DFS)广度优先(BFS)遍历
举报原因:
原因补充:

(最多只允许输入30个字)