深度搜索之邻接矩阵

文章介绍了如何使用深度优先搜索(DFS)遍历邻接矩阵表示的无向图。首先定义了DFS的基本递归函数,然后实现对整个图的遍历。在DFS函数中,从一个顶点开始,访问该顶点及其未访问的邻接点,直到所有顶点都被访问。最后,给出了完整的C语言代码示例,包括图的创建和DFS遍历。
摘要由CSDN通过智能技术生成

(该图出自《大话数据结构》)

那么对于邻接矩阵的遍历,我们也可以选择深度优先搜索

首先我们再来理解一下深度优先搜索:即为一个递归的一个过程,对于图来说,就是从一个顶点出发,先访问该顶点,然后从该顶点还未被访问的邻接点出发,进行同样的操作,直到访问所有的顶点(我们在这里称之为停止条件)

还是同样的思路,先解决递归函数

void DFS  (MGraph G,int i)
 {
     int j;
     visited[i]=1;
     printf("%d\n",G.vexs[i]);
     for(j=0;j<G.numEdges ;j++)
       if(G.arc[i][j]!=INFINITY&&!visited[j]) //寻找有效边,以及未遍历的顶点 
       DFS(G,j);
 }

再来解决对图的整的递归调用

void DFSTraverse(MGraph G)
 {
     int i;
     for(i=0;i<G.numVertexes ;i++)
       if(!visited[i])
       DFS(G,i);
 }

好的,现在附上完整的代码,包括邻接矩阵的建立以及遍历

#include<stdio.h>
#include<stdlib.h>
//建立无向图邻接矩阵
#define MAX 50   //最大顶点数 
#define INFINITY 666666   //表示不存在 
typedef int VertexType; //顶点数据类型 
typedef int EdgeType; //边上权值类型 
int visited[MAX]={0};
typedef struct 
{
    VertexType vexs[MAX];
    EdgeType arc[MAX][MAX];
    int numVertexes,numEdges; //顶点数目以及边数 
}MGraph;

//建立图
void Create(MGraph * G)
{
    int i,j,k,w;
    printf("输入顶点数以及边数\n");
    scanf("%d%d",&G->numVertexes,&G->numEdges);
    for(i=0;i<G->numVertexes;i++)
    {
    printf("请输入数据\n");
    scanf("%d",&G->vexs[i]);
    }
    for(i=0;i<G->numEdges;i++)
    {
        for(j=0;j<G->numEdges;j++)
        G->arc[i][j]=INFINITY;
    }
    for(k=0;k<G->numEdges;k++)
    {
        printf("请输入(vi,vj)的上下标,以及权值\n");
        scanf("%d%d%d",&i,&j,&w);
        G->arc[i][j]=w;
        G->arc[j][i]=w;
    }
    return ;
 } 
 //用深度优先搜索来遍历(depth-search-first)
 void DFS  (MGraph G,int i)
 {
     int j;
     visited[i]=1;
     printf("%d\n",G.vexs[i]);
     for(j=0;j<G.numEdges ;j++)
       if(G.arc[i][j]!=INFINITY&&!visited[j]) //寻找有效边,以及未遍历的顶点 
       DFS(G,j);
 }
 void DFSTraverse(MGraph G)
 {
     int i;
     for(i=0;i<G.numVertexes ;i++)
       if(!visited[i])
       DFS(G,i);
 }
 int main()
 {
     MGraph G;
     Create(&G);
     DFSTraverse(G);
     return 0;
 }

好了,又到了总结的时间,对于邻接矩阵和邻接表的遍历,总体的思路差不多,就是有一个基本的递归函数,以及对递归函数进行判断性的调用(判断性可以理解为,只用遍历为遍历的顶点),弄清这些就可以啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值