邻接矩阵表示的无向图深度遍历实现

Posted 阿宝逃离地球

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了邻接矩阵表示的无向图深度遍历实现相关的知识,希望对你有一定的参考价值。

邻接矩阵表示的无向图深度遍历实现

C语言

邻接矩阵表示的无向图实现

1.定义邻接矩阵结构

#define VerType int //定义顶点信息的类型
#define MVNum 10 //定义数组的最大长度
typedef int ArcType; //假设边的权值类型为整型
//定义邻接矩阵结构
typedef struct{
    //定义顶点表
    VerType vexs[MVNum];
    //定义邻接矩阵的边关系
    ArcType arcs[MVNum][MVNum];
    //定义顶点、弧/边的数量
    int vexnum,arcnum;
}AMGraph;

2.创建邻接矩阵的函数

用邻接矩阵表示法创建无向网,算法思想

  • 输入总顶点数和总边数
  • 依次输入点的信息存入顶点表中
    *初始化邻接矩阵,使每个权值初始化为0
  • 构造邻接矩阵

邻接矩阵的空间复杂度为O(n^2)

//创建邻接矩阵
void CreateUND(AMGraph *G){
    //输入顶点数和边数
    printf("please input the vexnum and arcnum:\\n");
    scanf("%d %d",&(G->vexnum),&(G->arcnum));
    //初始化顶点表
    printf("please input the info of vexs matrix:\\n");
    for (int i = 0; i < G->vexnum; i++)
    {
        scanf("%d",&(G->vexs[i]));
    }
    //初始化邻接矩阵
    for (int i = 0; i < G->vexnum; i++)
    {
        for (int j = 0; j < G->vexnum; j++)
        {
            G->arcs[i][j]= 0;//边的权值均为0
        }
    }

    //根据边/弧赋值矩阵
    for (int k = 0; k < G->arcnum; k++)
    {   
        // 一条边所依附的两个点
        //输入点和权值
        VerType v1,v2;
        int w;
        printf("please input the value of point v1 and point v2 and w:\\n");
        scanf("%d %d %d",&v1,&v2,&w);
        
        //找寻这两个点的下标
        int i = LocateG(*G,v1);
        int j = LocateG(*G,v2);

        if ((i!=-1) && (j!=-1))
        {
            G->arcs[i][j] = w;
            G->arcs[j][i] = w;
        } 
    }
}

//定位元素下标位置的函数
int LocateG(AMGraph p,VerType v){
    for (int i = 0; i < p.vexnum; i++)
    {
        if(p.vexs[i]==v) return i;
    }
    return -1;
}

3.深度遍历

方法

  • 在访问图的某一起始点v之后,由v出发,访问它的任意临界顶点w1;
  • 再从w1出发,访问与w1邻接但还未被访问过的顶点w2;
  • 再从w2出发,进行类似的访问;
  • 如此进行下去,直至到达所有的邻接点都被访问过为止。
  • 接着,退回一步,退到前一次刚访问过的顶点再出发,进行与前述类似的访问;
  • 如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止
void DFS(AMGraph G,int v,int visited[]){
    //访问第v+1个顶点,1<= v+1 <=vexnum
    visited[v] = 1;
    printf("%d\\t",G.vexs[v]);//输出访问顶点的值
    //依次检查邻接矩阵v所在的行
    for (int w = 0; w < G.vexnum; w++)
    {
        if ((G.arcs[v][w]!=0) && (visited[w]==0))
        {
            DFS(G,w,visited);
        }
    }
}

4.运行测试

int main(){
    AMGraph G;
    AMGraph *p = &G;

    //创建邻接矩阵
    CreateUND(p);

    //输出邻接矩阵
    printf("\\t");
    for (int i = 0; i < G.vexnum; i++)  printf("%d\\t",i+1);
    printf("\\n");
    for (int i = 0; i < G.vexnum; i++)
    {   
        printf("%d\\t",i+1);
        for (int j = 0; j <G.vexnum; j++)
        {
            printf("%d\\t",G.arcs[i][j]);
        }
        printf("\\n");
    }
    //深度优先遍历图
    //声明并初始化数组visited
    int visited[G.vexnum];
    for (int i = 0; i < G.vexnum; i++)
    {
        visited[i] = 0;
    }
    //输入起始点在顶点表中的下标0<=k<vexnum
    printf("please input the index of initial point:\\n");
    int k;
    scanf("%d",&k);
    DFS(G,k,visited);
    
    return 0;
}

要建立的图如图所示

运行输入输出结果如下:

以上是关于邻接矩阵表示的无向图深度遍历实现的主要内容,如果未能解决你的问题,请参考以下文章

求算法,用邻接矩阵和邻接表创建一个图,实现深度和广度搜索,菜单形式,c语言的代码。无向无权的图。

Java实现无向图的邻接列表表示,深度遍历及广度遍历

数据结构—无向图创建邻接矩阵深度优先遍历和广度优先遍历(C语言版)

用c语言编程 1创建图的邻接矩阵和邻接表 2验证图的深度优先、广度优先遍历算法 3验证最短路径

JS实现图的创建和遍历

给定一个无向图的邻接矩阵的图,要怎么遍历(深度和广度遍历)这个矩阵图,求方法啊