zoukankan      html  css  js  c++  java
  • 数据结构:图(1)

    一、图的基本概念

    1.有向图

    若图G中的每条边都是有方向的,则称G为有向图(Digraph)。

    2.无向图

    若图G中的每条边都是没有方向的,则称G为无向图(Undigraph)。

    3.连通图的生成树

    一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。

    二、图的存储结构

    1.数组表示法

    用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。

    2.邻接表表示法

    对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。

    三、图的遍历

    图的遍历是从某个顶点出发,沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问。它是许多图的算法的基础。

    1.深度优先遍历

    图的深度优先遍历类似于树的前序遍历。采用的搜索方法的特点是尽可能先对纵深方向进行搜索。

    2.广度优先遍历

    广度优先遍历类似于树的按层次遍历。采用的搜索方法的特点是尽可能先对横向进行搜索,故称其为广度优先搜索(Breadth-FirstSearch)。相应的遍历也就自然地称为广度优先遍历。

     1 ///Name:Tree
     2 ///Author:JA
     3 ///Date:2015-3-11
     4 
     5 
     6 
     7 ///图的存储结构
     8 //图的数组存储表示
     9 #define INFINITY   INT_MAX   //最大值
    10 #define MAX_VERTEX_MUN 20    //最大顶点个数
    11 typedef  enum{DG,DN,UDG,UDN}  GraphKind;  //{有向图,有向网,无向图,无向网}
    12 typedef struct ArcCell{
    13     VRType    adj;    //VRType是顶点关系类型
    14     InfoType  *info;  //该弧相关信息的指针
    15 }ArcCell,AdjMatrix[MAX_VERTEX_MUN][MAX_VERTEX_MUN];
    16 typedef struct{
    17     VertexType vexs[MAX_VERTEX_MUN];  //顶点向量
    18     AdjMatrix  arcs;                //邻接矩阵
    19     int vexnum, arcnum;             //图的当前顶点数和弧数
    20     GraphKind   kind;               //图的种类标志
    21 }MGraph;
    22 
    23 //图的邻接表存储表示
    24 typedef struct node{//边表结点
    25     int adjvex; //邻接点域
    26     struct node *next; //链域
    27         //若要表示边上的权,则应增加一个数据域
    28 }EdgeNode;
    29 typedef struct vnode{ //顶点表结点
    30     VertexType vertex; //顶点域
    31     EdgeNode *firstedge;//边表头指针
    32 }VertexNode;
    33 
    34 typedef VertexNode AdjList[MaxVertexNum];//AdjList是邻接表类型
    35 typedef struct{
    36     AdjList adjlist;//邻接表
    37     int n,e; 图中当前顶点数和边数
    38 }ALGraph; //对于简单的应用,无须定义此类型,可直接使用AdjList类型。 
    39 
    40 //深度优先遍历
    41 typedef enum{ FALSE,TRUE }Boolean;//FALSE为0,TRUE为1
    42 Boolean visited[MaxVertexNum]; //访问标志向量是全局量
    43 void DFSTraverse(ALGraph *G)
    44 { //深度优先遍历以邻接表表示的图G,而以邻接矩阵表示G时,算法完全与此相同
    45     int i;
    46     for (i = 0; i < G->n; i++)
    47         visited[i] = FALSE; //标志向量初始化
    48     for (i = 0; i < G->n; i++)
    49     if (!visited[i]) //vi未访问过
    50         DFS(G,i); //以vi为源点开始DFS搜索
    51 }//DFSTraverse
    52 
    53 //邻接表表示图的广度优先搜索算法
    54 void BFS(ALGraph*G,int k)
    55 {// 以vk为源点对用邻接表表示的图G进行广度优先搜索
    56     int i;
    57     CirQueue Q; //须将队列定义中DataType改为int
    58     EdgeNode *p;
    59     InitQueue(&Q);//队列初始化
    60     //访问源点vk
    61     printf("visit vertex:%e",G->adjlist[k].vertex);
    62     visited[k] = TRUE;
    63     EnQueue(&Q,k);//vk已访问,将其人队。(实际上是将其序号人队)
    64     while (!QueueEmpty(&Q)){//队非空则执行
    65         i = DeQueue(&Q); //相当于vi出队
    66         p = G->adjlist[i].firstedge; //取vi的边表头指针
    67         while (p){//依次搜索vi的邻接点vj(令p->adjvex=j)
    68             if (!visited[p->adivex]){ //若vj未访问过
    69                 printf("visitvertex:%c",C->adjlistlp->adjvex].vertex); //访问vj
    70                 visited[p->adjvex] = TRUE;
    71                 EnQueue(&Q, p->adjvex);//访问过的vj人队
    72             }//endif
    73             p = p->next;//找vi的下一邻接点
    74         }//endwhile
    75     }//endwhile
    76 }//end of BFS
    View Code

    3/11/2015 9:52:47 AM

  • 相关阅读:
    记一次线上OOM问题分析与解决
    理解JAVA内存模型
    SpringBoot+Shiro+JPA+LayUI的后台管理系统
    学会使用BeanUtils,提高你的开发效率
    一篇文章教你快速上手接口管理工具swagger
    js 多维数组转一维数组(根据字段展示)
    记一次阿里云服务器中部署egg遇到的问题 (docker vim)
    react 封装tab组件
    js 添加 好玩的注释
    js 下载文件流
  • 原文地址:https://www.cnblogs.com/joeaaron007/p/4330738.html
Copyright © 2011-2022 走看看