数据结构与算法基础 模块四

今天主要是有关于图的分享。

定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

  在图中需要注意的是:

  (1)线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(Vertex)

  (2)线性表可以没有元素,称为空表;树中可以没有节点,称为空树;但是,在图中不允许没有顶点(有穷非空性)。

  (3)线性表中的各元素是线性关系,树中的各元素是层次关系,而图中各顶点的关系是用边来表示(边集可以为空)。

图是由顶点集V和边E组成。每一条边就是一个点对(v,w)。如果点对是有序的(每一个点的下一个点是固定的),那么图被称为有向图,否则就是无向图。有的时候边还有权值。

图的路径是指一个顶点序列,v1,v2,v3,v4....vn,这条路径的长是这条路径的边数,等于n-1。

如果图中含有一条从一个顶点到他自身的边(v,v),那么路径v,v也叫做环。

简单路径的概念是指路径上所有的点都是互异的,但是第一个和最后一个点可能是同一个。

有向图中的圈是从一个顶点出发,回到自己,并且路径的长至少为1。如果这个路径是简单路径,则这个圈是简单圈。

而无向图的圈,要求这个边是互异的。

主要代码是:

void CreateUDG(Graph *G)

{

int i, j, k;

VertexType  va, vb;      //变量,存储顶点A和B

printf("Input the number of the vertex and arc:\n");

scanf("%d %d",&G->vexnum, &G->arcnum);

printf("input the name of the vertex:\n");

for(i=0; i<G->vexnum; i++)

scanf("%s",G->vexs[i]);

for (i = 0; i < G->vexnum; ++i)      // 初始化邻接矩阵

for (j = 0; j < G->vexnum; ++j)

{

G->arcs[i][j].adj  = 0;      // 无向图,所以都初始值为0

}

for (k = 0; k < G->arcnum; ++k)

{

printf("\nInput the first vertex:\n");

scanf("%s",va);

i = Locate(G, va);

printf("\nInput the last vertex:\n");

scanf("%s",vb);

j = Locate(G, vb);

G->arcs[i][j].adj = G->arcs[j][i].adj = 1;    // 无向图 ,两个顶点是一样的

}

G->kind = UDG;

}

如果一个无向图中从每一个顶点出发,都有到其他每个定点的路径,则这个图是联通的。具有这种性质的有向图被称为强连通图。

如果把一个有向图的所有有向边去掉方向形成的无向图被称为这个有向图的基础图,也叫基图。

有向图不是强连通,但是他的基图是连通的,则被称为弱连通。

顶点的度

  顶点Vi的度(Degree)是指在图中与Vi相关联的边的条数。对于有向图来说,有入度(In-degree)和出度(Out-degree)之分,有向图顶点的度等于该顶点的入度和出度之和。

邻接

  ①若无向图中的两个顶点V1和V2存在一条边(V1,V2),则称顶点V1和V2邻接(Adjacent);

  ②若有向图中存在一条边<V3,V2>,则称顶点V3与顶点V2邻接,且是V3邻接到V2或V2邻接直V3

完全图是其每一对顶点之间都存在一条边的图。

邻接表表示:

邻接表的表现形式和散列有些像。数组的每个下标中都存放这一个互异的顶点作为头节点,然后以链表方式在头节点之后存储它的邻接点。

在用邻接表描述有向图时,实质存储的是点a->点b->点c。需要注意的是每个顶点可能会出现多次。例如a->b; c->a->b;  a,b都出现了两次。

而在无向图中,存储的是点a的所有出度和入度。即所有和他有关的边。

原文地址:https://www.cnblogs.com/bibabo/p/9342987.html

时间: 2024-10-02 20:39:50

数据结构与算法基础 模块四的相关文章

数据结构与算法基础 模块一

在软件水平考试中,数据结构与算法基础的相关内容是考试上午进行的,那么,接下来将对有关数据结构的内容进行整理和归纳,以便于在整个的软考准备阶段能够更加清楚和有效率的进行学习和回忆. 以下均为个人针对于数据结构的相关内容的整理,后期根据深入的程度不断地完善和改进,如果有什么错误或者不足,希望可以提出来,一起进步. 常用的数据结构:      数组(静态数组,动态数组),线性表,链表(单向链表,双向链表,循环链表),队列,栈,树(平衡数,二叉树,查找树,堆,线索树),图等的定义,存储和操作,HASH(

数据结构与算法基础 模块六

简单选择排序: 设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(R,R[i+1],-,R[n]中找出排序码最小的记录,与第i个记录交换.执行n-1趟 后就完成了记录序列的排序. 代码如下: public  void SimpleSelect() { int[] inputIntArray = new int[8] { 8, 4, 7, 5, 2, 3, 6, 1 }; for (int i = 1; i < inputIntArray.Length; i++) { i

数据结构与算法基础 模块七

二叉树的补充: 线索二叉树: 1.引入线索二叉树 二叉树的遍历实质上是对一个非线性结构实现线性化的过程,使每一个节点(除第一个和最后一个外)在这些线性序列中有且仅有一个直接前驱和直接后继.但在二叉链表存储结构中,只能找到一个节点的左.右孩子信息,而不能直接得到节点在任一遍历序列中的前驱和后继信息.这些信息只有在遍历的动态过程中才能得到,因此,引入线索二叉树来保存这些从动态过程中得到的信息. 2.建立线索二叉树 为了保存节点在任一序列中的前驱和后继信息,可以考虑在每一个节点中增加两个指针域存放遍历

数据结构与算法基础学习笔记

*********************************************            ---算法与数据机结构--- 数据结构:由于计算机技术的发展,需要处理的对象不再是纯粹的数值,还有像字符,表,图像等具有一定结构的数据,需要用好的算法来处理这些数据. 我们把现实中大量而又复杂的问题以特定的数据类型的特定的存储结构保存到主存储器中,以及在此基础上为实现某个功能而执行的相应操作(查找排序),这个相应的操作也叫算法. 数据结构 = 个体 +个体的关系算法 =对存储数据的操

数据结构与算法基础

数据结构与算法基础: 顺序存储结构 链式存储结构 什么是树结构?为什么使用树结构?树的基本概念 二叉树: 任何一个节点的子节点数量不超过2 二叉树的子节点分左节点和右节点 满二叉树:所有的叶子节点都在最后一层,而且节点总数为2的n次方-1[n是树的高度]完全二叉树:所有叶子节点都在最后一层或者倒数第二层,且最后一层的叶子节点在左边连续,倒数第二节的叶子节点在右边连续 数组在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来.这些按序排列的同类数据元素的集合称为数组.在C语言

数据结构与算法系列研究四——数组和广义表

稀疏矩阵的十字链表实现和转置 一.数组和广义表的定义 数组的定义1:一个 N 维数组是受 N 组线性关系约束的线性表.           二维数组的逻辑结构可形式地描述为:           2_ARRAY(D,R)              其中 D={aij} | i=0,1,...,b1-1; j=0,1,...,b2-1;aij∈D0}              R={Row,Col}              Row={<aij,ai,j+1>|0<=i<=b1-1;

Java数据结构与算法(第四章栈和队列)

本章涉及的三种数据存储类型:栈.队列和优先级队列. 不同类型的结构 程序员的工具 数组是已经介绍过的数据存储结构,和其他结构(链表.树等等)一样,都适用于数据应用中作数据记录. 然而,本章要讲解的是数据结构和算法更多的是作为程序员的工具来运用.它们组要作为构思算法的辅助工具,而不是完全的数据存储工具.这些数据结构的生命周期比那些数据库类型的结构要短的多.在程序操作执行期间它们才被创建,通常它们去执行某项特殊的任务,当完成之后,它们就被销毁. 受限访问 在数组中,只要知道下标就可以访问数据项.或顺

数据结构与算法基础之概述、指针与内存

数据结构的定义 我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序而执行的相应操作,这个操作也叫算法) 数据结构 = 个体 + 个体的关系 算法 = 对存储数据的操作 衡量算法的标准: 时间复杂度:大概程序要执行的次数,而非执行的时间 空间复杂度:算法执行过程中大概所占用的最大内存 难易程度 健壮性 内存的基本概念: 1.内存是用来存储数据的设备.它的存储速度介于寄存器和硬盘之

数据结构之算法基础

算法:  大O表示法: 代码(求出数组中出现次数最多的数字): 原文地址:https://www.cnblogs.com/souhaite/p/11030245.html