邻接矩阵实现图的深度优先搜索(2)

/*树的邻接矩阵的存储结构*/
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX      10
#define InitEdge    0
typedef char VertexType;
typedef int EdgeType;
typedef struct MGraph
{
    VertexType vex[MAXVEX];
    EdgeType arc[MAXVEX][MAXVEX];
    int numVertexes;
    int numEdges;
}MGraph;
static int Flag[MAXVEX];
void CreateMGraph(MGraph *G)
{
    int i = 0,j = 0,k = 0,w = 0,m = 0,n = 0;
    char c;
    printf("请输入顶点数和边数,之间用逗号隔开 :\n");
    fflush(stdin);
    scanf("%d,%d",&(G->numVertexes),&(G->numEdges));
    printf("请输入顶点的值 :\n");
    fflush(stdin);
    scanf("%c",&c);
    while(i < G->numVertexes)
    {
        if(c == ‘\n‘)
            break;
        G->vex[i++] = c;
        scanf("%c",&c);
    }
    //邻接矩阵的初始化
    for(i = 0;i < G->numVertexes;i++)                                   //邻接矩阵的初始化,初始化为0
    {
        for(j = 0;j < G->numVertexes;j++)
        {
            G->arc[i][j] = InitEdge;
        }
    }
    for(i = 0;i < G->numVertexes;i++)                                   //标识数组的初始化,0表示未访问过
    {
        Flag[i] = 0;
    }
    fflush(stdin);
    for(m = 0,n = 0,k = 0; k < G->numEdges; k++)
    {
        printf("请输入边(Vi~Vj)的顶点下标i和j,以及权重w:\n");
        scanf("%d,%d,%d",&m,&n,&w);
        G->arc[m][n] = w;
        G->arc[n][m] = G->arc[m][n];
    }
    printf("\n\n结点中存放的数据为 :\n");
    for(i = 0;i < G->numVertexes;i++)
    {
        printf("%c ",G->vex[i]);
    }
    printf("\n\n您输入的邻接矩阵为:\n");
    for(i = 0;i < G->numVertexes;i++)                                 //输出邻接矩阵方便查看输入是否有误
    {
        for(j = 0;j < G->numVertexes;j++)
        {
            printf("%d ",G->arc[i][j]);
        }
        printf("\n");
    }
    printf("\n\n标示数组的值初始化为 :\n");
    for(i = 0;i < G->numVertexes;i++)
    {
        printf("%d ",Flag[i]);
    }

}
void DepthFirstSearch(MGraph *G,int i)
{
    int j = 0;
    if(Flag[i] == 0)
    {
        printf("%c ",G->vex[i]);
    }
    Flag[i] = 1;
    for(j = 0;j < G->numVertexes;j++)
    {
        if((G->arc[i][j]) != InitEdge && 0 == (Flag[j]))
        {
            DepthFirstSearch(G,j);
        }
    }

}

int main()
{
    int k = 0;                                      //设置从邻接矩阵的第几行开始DFS搜索,这里从第1行开始
    struct MGraph *G;
    CreateMGraph(G);
    printf("\n**********************************************\n");
    printf("DFS的排序结果为: \n");
    DepthFirstSearch(G,k);
    printf("\n**********************************************\n");
    return 0;
}

  

时间: 2024-10-07 10:10:50

邻接矩阵实现图的深度优先搜索(2)的相关文章

邻接矩阵创建图,深度优先搜索

#include "stdio.h" #include "stdlib.h" #define TRUE 1 #define FALSE 0 typedef int Boolean; typedef char VertexType; typedef int EdgeType; #define MAXSIZE 9 #define MAXEDGE 15 #define MAXVEX 9 #define INFINITY 65535 typedef struct { Ver

图的深度优先搜索 递归和非递归实现 c++版本

本文参考了李春葆版本的数据结构上机指导,但是原版是c代码, 本文用了c++实现,并且修复了深度优先搜索非递归的一个bug. graph.cpp文件: #include "graph.h" #include <queue> #include <stack> int visited[MAXV ]; MGraph ::MGraph(int A[100][10], int nn , int ee) { e= ee ; n= nn ; for (int i=0;i<

图的深度优先搜索(DFS)简介与实现(递归与非递归方法)

上一篇刚刚学习了C++图的实现,今天对深度优先搜索(DFS)进行了一定学习,并作出一定实现.在本文中图的实现,以及相应的函数调用(如获得第一个邻接顶点.获得下一个邻接顶点等)均是基于上文中的实现,故如果想参考测试代码,还需导入上文中相应的类定义.关于C++图的实现可参考此处,这里实现了对图的邻接表以及邻接矩阵两种实现,而本文的深度优先搜索对于上面两种实现均是可行的. 当然,对于图的深度优先搜索的相关定义,本文也不再过多赘述,维基的解释应该就足够,下面将探讨其实现. 1.深度优先搜索的非递归实现:

图的深度优先搜索及拓扑排序

本文将介绍图的深度优先搜索,并实现基于深度优先搜索的拓扑排序(拓扑排序适用于有向无环图,下面详细介绍). 1. 图的深度优先遍历要解决的问题 图的深度优先搜索与树的深度优先搜索类似,但是对图进行深度优先搜索要解决一个问题,那就是顶点的重复访问,假设图中存在一个环路A-B-C-A,那么对顶点A进行展开后得到B,对B进行展开后得到C,然后对C进行展开后得到A,然后A就被重复访问了... 这显然是不对的!我们需要用一个状态变量来记录一个顶点被访问和被展开的状态.在<算法导论>中,作者使用3种颜色来对

PTA 邻接矩阵存储图的深度优先遍历

6-1 邻接矩阵存储图的深度优先遍历(20 分) 试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVe

练习6.1 邻接矩阵存储图的深度优先遍历 (20分)

试实现邻接矩阵存储图的深度优先遍历. 函数接口定义: void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) ); 其中MGraph是邻接矩阵存储的图,定义如下: typedef struct GNode *PtrToGNode; struct GNode{ int Nv; /* 顶点数 */ int Ne; /* 边数 */ WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */ }; t

&quot;《算法导论》之‘图’&quot;:深度优先搜索、宽度优先搜索及连通分量

本文兼参考自<算法导论>及<算法>. 以前一直不能够理解深度优先搜索和广度优先搜索,总是很怕去碰它们,但经过阅读上边提到的两本书,豁然开朗,马上就能理解得更进一步.  1. 深度优先搜索  1.1 迷宫搜索 在<算法>这本书中,作者写了很好的一个故事.这个故事让我马上理解了深度优先搜索的思想. 如下图1-1所示,如何在这个迷宫中找到出路呢?方法见图1-2. 图1-1 等价的迷宫模型 探索迷宫而不迷路的一种古老办法(至少可以追溯到忒修斯和米诺陶的传说)叫做Tremaux搜

算法_图的深度优先搜索和广度优先搜索

一.图的基本数据结构 图是由一组顶点和一组能够将两个顶点相互连接的边所构成的,一般使用0~V-1这样的数字形式来表示一张含有V个顶点的图.用v-w来指代一张图的边,由于是无向图,因此v-w和w-v是同一种边的两种表示方法.无向图是指边没有方向的图结构在无向图中,边仅仅表示的是两个顶点之间的连接.图的数据结构的可视化如下图所示(其中边上的箭头没有任何意义): 当两个顶点通过一条边相互连接,则称这两个顶点是相邻的.某个顶点的度数即为依附它的边的总数.当两个顶点之间存在一条连接双方的路径的时候,称为这

图的深度优先搜索与广度优先搜索

无向图的深度优先搜索与广度优先搜索 #include "stdafx.h" #include<vector> #include<iostream> using namespace std; #define N 9 typedef struct{ int vexnum, arcnum; char vexs[N]; int matirx[N][N]; }graph; graph g; int a[N] = { 0 }; // 初始化图数据 // 0---1---2-