zoukankan      html  css  js  c++  java
  • 数据结构无向图的深度优先遍历

    以以下的图片为例题,仅给出源码,不谈算法思想。

    #include <stdio.h>
    #include <cstring>
    #include <iostream>
    #define MAX_VERTEX_NUM 20+3 //最大顶点数量
    //#define true 1
    //#define false 0
    using namespace std;
    
    typedef char VERTEX_TYPE; //顶点的类型
    
    typedef struct node
    {
       int vertex_num;    //顶点的数量
       int edge_num;      //边的数量
       VERTEX_TYPE vertex[MAX_VERTEX_NUM];//顶点信息
       int matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  //邻接矩阵
       bool visited[MAX_VERTEX_NUM];  //用于深度搜索的
    }Undigraph;//无向图
    
    void init_undigraph(Undigraph *G)//初始化图
    {
       G->vertex_num = G->edge_num = 0;
       memset(G->vertex,0,sizeof(G->vertex));
       memset(G->matrix,0,sizeof(G->matrix));
       memset(G->visited,0,sizeof(G->visited));  //应该能够用来初始化逻辑数组吧
    }
    void add_vertex(Undigraph *G)//添加顶点
    {
       printf("请输入顶点的数量
    ");
       cin>>G->vertex_num;//scanf("%d",&G->vertex_num);
    
       for(int i=0; i < G->vertex_num; ++i)
          cin>>G->vertex[i];//scanf("%c",&G->vertex[i]);
    }
    int locate_vertex(Undigraph *G,VERTEX_TYPE who)//寻找某个顶点的位置
    {
       for(int index = 0; index < G->vertex_num; ++index)
          if( G->vertex[index] == who )
            return index;    //return 找不到
        return -1;//意味着没找到
    }
    void add_edge(Undigraph *G)//添加边
    {
       printf("请输入边的数量
    ");
       cin>>G->edge_num;//scanf("%d",&G->edge_num);
    
       for(int i=0; i < G->edge_num; ++i)
       {
          VERTEX_TYPE s1,s2;//边的两端的顶点
          cin>>s1>>s2;//scanf("%c %c",&s1,&s2);
          int index_1 = locate_vertex(G,s1);//找到这两个顶点所在的下标
          int index_2 = locate_vertex(G,s2);//同上
          G->matrix[index_1][index_2] = G->matrix[index_2][index_1] = 1;//矩阵是对称的
       }
    }
    void create_undigraph(Undigraph *G)//构造一个无向图
    {
       add_vertex(G);//添加顶点
       add_edge(G);  //添加边
    }
    void DFS(Undigraph *G,int i)
    {
       cout<<G->vertex[i];//printf("%c ",&G->vertex[i]);
       G->visited[i] = true;
    
       for(int j=0; j < G->vertex_num; ++j)
          if(G->matrix[i][j] == 1 && !G->visited[j])
            DFS(G,j);
    }
    void DFS_Traverse(Undigraph *G)
    {
       for(int i=0; i < G->vertex_num; ++i)
          if(!G->visited[i])
            DFS(G,i);
    }
    int main(void)
    {
       Undigraph G;
       init_undigraph(&G);//初始化无向图
       create_undigraph(&G);//构造一个无向图
       DFS_Traverse(&G);//深度优先遍历
       return 0;
    }

  • 相关阅读:
    idea 红线 并提示idea cant resolve symbol
    shell 脚本不能执行多条?何解
    怎么在linux下创建一个可运行脚本?
    java linux sdk1.8
    Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:co
    什么是结构化数据和非结构化数据?什么是数据清洗?
    Installation failed with message Failed to finalize session: INSTALL_FAILED_TEST_ONLY:installPackageLI.
    Tensorflow-目标检测之yolov3训练自己的模型
    Tensorflow-目标检测之yolov3训练自己的模型
    《C#高效编程》读书笔记11-理解短小方法的优势
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4253392.html
Copyright © 2011-2022 走看看