有向赋权图

有向赋权图
有向赋权图

图论基本概念

重要定义:

有向图:每条边都是有向边的图。

无向图:每条边都是无向边的图。

混合图:既有有向边又有无向边的图。

自回路:一条边的两端重合。

重数:两顶点间若有几条边,称这些边为平行边,两顶点a,b间平行边的条数成为(a,b)的重数。

多重图:含有平行边的图。

简单图:不含平行边和自回路的图。

注意!一条无向边可以用一对方向相反的有向边代替,因此一个无向图可以用这种方法转化为一个有向图。

定向图:如果对无向图G的每条无向边指定一个方向由此得到的有向图D。称为的G定向图.

底图:如果把一个有向图的每一条有向边的方向都去掉,得无向图G称为的D

底图。

逆图:把一个有向图D的每条边都反向由此得到的图称为D的逆图。

赋权图:每条边都赋上了值。

出度:与顶点相连的边数称为该定点的度数,以该定点为始边的边数为出度。入度:以该定点为终边的边数为入度。

特殊!度数为零的定点称为孤立点。度数为一的点为悬挂点。

无向完全图:在阶无向图中如果任何两点都有一条边关连则称此图是无向完全图。Kn

完全有向图:在阶有向图中如果任意两点都有方向相反的有向边相连则称此图为完全有向图。

竟赛图:阶图中如果其底图是无向完全图,则程此有向完全图是竟塞图。

注意!n阶有向完全图的边数为n的平方;无向完全图的边数为n(n-1)/2。

下面介召图两种操作:①删边:删去图中的某一条边但仍保留边的端点。

②删点:删去图中某一点以及与这点相连的所有边。

子图:删去一条边或一点剩下的图。

生成子图:只删边不删点。

主子图:图中删去一点所得的子图称的主子图。

补图:设为阶间单无向图,在中添加一些边后,可使成为阶完全图;由这些添加边和的个顶点构成的图称为的补图。

重要定理:

定理5.1.1 设图G是具有n个顶点m条边的有向图,其中点集V={v,v, (v)

deg+(vi)=deg-(vi)=m

定理5.1.2 设图G是具有n个顶点m条边的无向图,其中点集V={v,v,v, (v)

deg(vi)=2m

推论在无向图中,度数为积数的顶点个数为偶数。

通路和富权图的最短通路

1通路和回路

基本概念:

通路的长度:通路中边的条数。

回路:如果通路中始点与终点相同。

简单通路:如果通路中各边都不相同。

基本通路:如果通路中各顶点都不相同。显然(基本通路一定是简单通路,但简单通路不一定是基本通路)

可达:在图G中如果存在一条v到d通路则称从v到d是可达。

连通:在无向图中如果任意两点是可达的,否则是不连通的。

强连通:在有向图中如果任意两点是互可达的。

单向连通:在有向图中如果存在任意两点的通路。

弱连通:在有向图中如果其底图是连通的。

权:在图的点或边上表明某种信息的数。

赋权图:含有权的图。

赋权图的最短通路问题的算法:先求出到某一点的最短通路,然后利用这个结果再去确定到另一点的最短通路,如此继续下去,直到找到到的最短通路为止。指标:设V是图的点集,T是V的子集,且T含有z但不含a,则称T为目标集。在目标集T中任取一个点t,由a到t但不通过目标集T中其它点所有通路中,个边权和的最小者称为点t关与T的指标记作DT(t)。

图和矩阵

住意两个的区别:A·A 中元素的意义:当且仅当a 和a 都是1时,a a =1而a 和a 都为1意味着图G中有边(v ,v )和(v ,v )。于是可得如下结论:从顶点v 和v 引出的边,如果共同终止于一些顶点,则这些终止顶点的数目就是b 的值;特别对于b ,其值就是v 的出度。

A ·A中元素的意义:当且仅当a 和a 都为1时,a a =1,这意味着图中有边(v ,v )和(v ,v )。于是的得如下结论:从某些点引出的边,如果同时终止于v 和v ,则这样的顶点数就是的值。特别对于b ,其值就是的v 入度。

幂A 中元素的意义:当m=1时,a 中的元素=1,说明存在一条边(v ,v ),或者说从v 到v 存在一条长度为一的通路。

A 中元素a 表示从v 到v 的长度为m的所有通路的数目。

欧拉图

主要定义:

如果图中存在一条通过图中个边一次且仅一次的回路,则称此回路为欧拉回路,具有欧拉回路的图称为欧拉图。

如果图中存在一条通过图中各边一次且仅一次的通路,则称此回路为欧拉通路,具有欧拉通路的图称为半欧拉图。

主要定理:一个无向连通图是欧拉图的充要条件是图中各点的度数为偶数。

一个无向连通图是半欧拉图的充要条件是图中至多有两个奇数度点。

设图G是有向连通图,图G是欧拉图的充要条件是图中每个顶点的入度和出度相等。

设图G是有向连通图,图G是半欧拉图的充要条件是至多有两个顶点,其中一个顶点入度比它的出度大1,另一个顶点入度比它的出度少1;而其他顶点的入度和出度相等。

哈密顿图

主要定义:如果图G中存在一条通过图G中各个顶点一次且仅一次的回路,则称此回路为图的哈密顿回路;具有哈密顿回路的图称为哈密顿图。

如果图G中存在一条通过图G中各个顶点一次且仅一次的回路,则称此回路为图的哈密顿回路;具有哈密顿回路的图称为哈密顿图。

主要定理:设图G是哈密顿图,如果从G中删去个p顶点得到图G’,则图G’的连通分支数小于等于p。

设图G是具有n个顶点的无向简单图,如果G中任意两个不同顶点的度数之和大于等于n-1,则具有哈密顿通路,即G是半哈密顿图。

设图G是具有n个顶点的无向简单图,如果G中任意两个不同顶点的度数之和大于等于n,则G具有哈密顿回路,即G是哈密顿图。

用matlab寻找赋权图中的最短路

用matlab寻找赋权图中的最短路 专业: 小组:第22小组 小组成员: 课题:用matlab寻找赋权图中的最短路 采用形式:集体讨论,并到图书馆搜集相关资料,进行编程,运行。最后以论文的形式表现出来。 1引言 图论是应用数学的一个分支,它的概念和结果来源都非常广泛,最早起源于一些数学游戏的难题研究,如欧拉所解决的格尼斯堡七桥问题,以及在民间广泛流传的一些游戏的难题,如迷宫问题,博弈问题等。这些古老的难题,吸引了很多学者的注意。 1847年,图论应用于分析电路网络,这是它最早应用于工程科学,以后随着科学的发展,图论在解决运筹学,网络理论,信息论,控制论,博弈论以及计算机科学等各个领域的问题时,发挥出很大的作用。在实践中,图论已成为解决自然科学,工程技术,社会科学,军事等领域中许多问题的有力工具之一。 最短路问题是图论理论中的经典问题,寻找最短路径就是在指定网络中两节点间找一条距离最小的路。 2 最短路 2.1 最短路的定义(short-path problem) 对最短路问题的研究早在上个世纪60年代以前就卓有成效了, 若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路问题。最短路问题是网络理论解决的典型问题之一,它不仅可以直接应用于解决生产实际的许多问题,如管路铺设、线路安装、厂区布局和设备更新等,而且经常被作为一个基本的工具,用于解决其他的做优化问题。 定义1:若图G=G(V,E)中个边[v i,v j]都赋有一个实数w ij ,则称这样的图G为赋权图,w ij 称为边[v i,v j]上的权。 定义2:给定一个赋权有向图,即给一个有向图D=(V,A),对每一个弧a=(v i,v j),相应地有权w(a)=w ij,又给定D中的两个顶点v s ,v t 。设P是D中从v s 到v t 的一条路,定义路P的权是P中所有弧的权之和,记为w(P)。最短路问题就是要在所有从v s到v t 的路中,求一条权最小的路,即求一条从v s min w(P)式中对D中所有从v s到v t 的路P最小,到v t 的路P0 ,使w(P0)= P 称P0 是从v s到v t 的最短路。 2.2最短路问题算法的基本思想及其基本步骤 在求解网络图上节点间最短路径的方法中,目前国内外一致公认的比较好的算法有Dijkstra和Floyd算法。这两种算法,网络被抽象为一个图论中定义的有向图或无向图,并利用图的节点邻接矩阵记录点的关联信息。在进行图的遍历搜

实习三--求无向连通图的生成树

实习三求无向连通图的生成树 1?需求分析 问题描述: 若要在n个城市之间建设通信网络,只需要架设n-1条路线即可。如何以最低的经济代价建设这个通信网,是一个网的最小生成树问题。 基本要求: (1) 利用克鲁斯卡尔算法求网的最小生成树,其中,以课本8.7节中的等 价类表示构造生成树过程中的连通分量。 (2) 利用普里姆算法求网的最小生成树。 (3) 以文本文件形式输出生成树中各条边以及他们的权值。 2.设计 (1) 设计思想:创建邻接矩阵存储结构。本程序主要分为两个模块:创建邻接矩阵模块,最小生成树模块。创建邻接矩阵模块:以邻接矩阵的存储形式创建无向网。最小生成树模块:生成最小生成树,输出其各条边及权值。 (2) 概要设计:int型LocateVex函数判断权值在矩阵的位置;声明CraeteGraph 函数创建邻接矩阵;声明kruskal函数用于生成最小生成树;声明main函数为程序调用步骤。 (3) 设计详细:a.将程序分为两个模块: B. 主函数流程图:

C. 最小生成树流程图 (4) 调试分析:--变量没定义就使用 --子函数嵌套定义; --使用数组是越界; (5) 用户手册:a.主页面: 解决:定义完变量在使用。 解决:子函数单独定义,可调用。 解决:注意数组的值,注意不能越界 b.输入顶点数及边数的信息:

d.输入顶点及权值 c.输入顶点信息 (6)测试结果:输出最小生成树及 权值 #i nclude #i nclude #i nclude #defi ne MAX 100 #defi ne MAX_VERTEXNUM 20 typedef char Vertex[MAX];〃 顶点字符串 typedef int Adjmatrix[MAX_VERTEXNUM][MAX_VERTEXNUM];〃 邻接矩阵 typedef struct//定义图 〔用空格隔 卷迎建设通 请输入顶蕉 譎入m 个顶点的信息* :青紹3条边的两个顶点及权値;〔用空格隔开) 欢迎建 i 珮入 请输入彳个顶点的信息; 論条迪的两个顶点及权值;(用空格隔开) 嚴费矗数颓边数’(用空槨研) 歸 个顶点的信息:(压空格隔开) 最小生成树的各条边及权值 为 1-2-1 飯黑边数:(用空格隔 开) (用空格隔开) 長和边数:(用空格隔开) (用空格隔开) 嬲边数

图的邻接矩阵和邻接表相互转换

图的邻接矩阵和邻接表相互转换 图的邻接矩阵存储方法具有如下几个特征:1)无向图的邻接矩阵一定是一个对称矩阵。 2)对于无向图的邻接矩阵的第i 行非零元素的个数正好是第i 个顶点的度()i v TD 。3)对于有向图,邻接矩阵的第i 行非零元素的个数正好是第i 个顶点的出度()i v OD (或入度 ()i v ID ) 。4)用邻接矩阵方法存储图,很容易确定图中任意两个顶点之间是否有边相连;但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所发费得时间代价大。 邻接表是图的一种顺序存储与链式存储相结合的存储方法。若无向图中有n 个顶点、e 条边,则它的邻接表需n 个头结点和2e 个表结点。显然,在边稀疏的情况下,用邻接表表示图比邻接矩阵存储空间。在无向图的邻接表中,顶点i v 的度恰好是第i 个链表中的结点数,而在有向图中,第i 个链表中结点个数是顶点i v 的出度。 在建立邻接表或邻逆接表时,若输入的顶点信息即为顶点的编号,则建立临接表的时间复杂度是)(e n O +;否则,需要通过查找才能得到顶点在图中位置,则时间复杂度为)*(e n O 。在邻接表上容易找到任意一顶点的第一个邻接点和下一个邻接点,但要判断任意两个顶点之间是否有边或弧,则需要搜索第i 个或第j 个链表,因此,不及邻接矩阵方便。 邻接矩阵和邻接表相互转换程序代码如下: #include #define MAX 20 //图的邻接表存储表示 typedef struct ArcNode{ int adjvex; //弧的邻接定点 char info; //邻接点值 struct ArcNode *nextarc; //指向下一条弧的指针 }ArcNode; typedef struct Vnode{ //节点信息 char data; ArcNode *link; }Vnode,AdjList[MAX]; typedef struct{ AdjList vertices; int vexnum; //节点数 int arcnum; //边数

数据结构与算法-图的邻接矩阵

实验报告实验日期:数据结构与算法课程: 图的邻接矩阵实验名称: 一、实验目的掌握图的邻接矩阵 二、实验内容必做部分 、给出图的邻接矩阵存储结构的类型定义。1 -1。v,返回其在vexs数组中的下标,否则返回2、实现LocateVex(G,v)操作函数:若找到顶点。、实现算法7.2(构造无向网)3&G) Status CreateUDN(MGraph 设计并实现无向网的输出算法,要求能显示顶点以及顶点之间的邻接关系(方式自定)4、 并进行输出。要求给出至少两组测试数据。在主函数中调用CreateUDN创建一个无向网,5、 选做部分 类型)编写下述操作函数:基于图的邻接矩阵存储结构(即MGraph若找不到这样返回该邻接点在顶点数组中的下标;1个邻接点,1、求下标为v的顶点的第-1。的邻接点,返回int FirstAdjVex(MGraph G,int v) 的顶点的下一个邻接点,返回该邻接点的下标;若w求下标为v的顶点相对于下标为2、找不到这样的邻接点,返回-1。 int NextAdjVex(MGraph G,int v,int w) 在主函数调用上述函数,给出测试结果。 三、实验步骤 必做部分 给出图的邻接矩阵存储结构的类型定义。、 1.

2、实现LocateVex(G,v)操作函数:若找到顶点v,返回其在vexs数组中的下标,否则返回-1。 3、实现算法7.2(构造无向网)。 &G) CreateUDN(MGraph Status

设计并实现无向网的输出算法,要求能显示顶点以及顶点之间的邻接关系(方式自定)、

4. 要求给出至少两组测试数据。并进行输出。、在主函数中调用CreateUDN创建一个无向网,5

7.4.1无向图的连通分量和生成树

7.4.1无向图的连通分量和生成树。

void DFSForest(Graph G,CSTree &T) //建立无向图G的深度优先生成森林的 //(最左)孩子(右)兄弟链表T。 { T=NULL; for(v=0;vnextSibling=p; //是其他生成树的根(前一棵的根的“兄弟”)。 q=p; //q指示当前生成树的根。 DFSTree(G,v,p); //建立以p为根的生成树。 }// if(!visited[v]) }// for(v=0;vlchild=p;first=FALSE; }// if(first) else //w是v的其它未被访问的邻接顶点 { //是上一邻接顶点的右兄弟节点。 q->nextsibling=p; }// else q=p; DFSTree(G,w,q); //从第w个顶点出发深度优先遍历图G,建立子生成树q。 }// if(!visited[w]) }// for(w=FirstAdjVex(G,v); }// DFSTree

用邻接矩阵表示法创建有向图(数据结构)

#include #include #include #define MAX_VERTEX_NUM 20 //定义最多顶点个数 #define INFINITY32768 //定义无穷大 //描述图的类型,用枚举型类型来说明 typedef enum{DG,DN,UDG,UDN}GraphKind; //定义顶点数据类型 typedef char V ertexData; //定义邻接矩阵中元素值(即边信息)的数据类型 typedef int ArcNode; //定义图的邻接矩阵类型:一个顶点信息的一维数组,一个邻接矩阵、当前图中包含的顶点数、边数以及图类型(有向图、有向网、无向图、无向网) typedef struct { V ertexData vertex[MAX_VERTEX_NUM]; ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vertexnum,arcnum; GraphKind kind; } AdjMatrix;//图的邻接矩阵表示类型 int LocateV ertex(AdjMatrix *G,V ertexData v) //求顶点位置函数 { int j=-1,k; for(k=0;kvertexnum;k++) { if(G->vertex[k]==v) { return k; } } return j; } int CreateDN(AdjMatrix *G) //创建一个又向网 { int i,j,k,weight; V ertexData v1,v2; printf("输入图的顶点数和弧数,以逗号分隔\n"); //输入图的顶点数和弧数 scanf("%d,%d",&G->vertexnum,&G->arcnum); for(i=0;ivertexnum;i++) //初始化邻接矩阵(主对角线元素全为零,其余元素为无穷大) {

实现图的邻接矩阵和邻接表存储

实现图的邻接矩阵和邻接表存储 1.需求分析 对于下图所示的有向图G,编写一个程序完成如下功能: 1.建立G的邻接矩阵并输出之 2.由G的邻接矩阵产生邻接表并输出之 3.再由2的邻接表产生对应的邻接矩阵并输出之 2.系统设计 1.图的抽象数据类型定义: ADT Graph{ 数据对象V:V是具有相同特性的数据元素的集合,称为顶点集 数据关系R: R={VR} VR={|v,w∈V且P(v,w),表示从v到w的弧, 谓词P(v,w)定义了弧的意义或信息} 基本操作P: CreatGraph(&G,V,VR) 初始条件:V是图的顶点集,VR是图中弧的集合 操作结果:按V和VR的定义构造图G DestroyGraph(&G) 初始条件:图G存在 操作结果:销毁图G InsertVex(&G,v) 初始条件:图G存在,v和图中顶点有相同特征 操作结果:在图G中增添新顶点v …… InsertArc(&G,v,w) 初始条件:图G存在,v和w是G中两个顶点 操作结果:在G中增添弧,若G是无向的则还增添对称弧 …… DFSTraverse(G,Visit()) 初始条件:图G存在,Visit是顶点的应用函数 操作结果:对图进行深度优先遍历,在遍历过程中对每个顶点调用函数Visit一次且仅一次。

一旦Visit()失败,则操作失败 BFSTraverse(G,Visit()) 初始条件:图G存在,Visit是顶点的应用函数 操作结果:对图进行广度优先遍历,在遍历过程中对每个顶点调用函数Visit一次且仅一次。一旦Visit()失败,则操作失败 }ADT Graph 2.主程序的流程: 调用CreateMG函数创建邻接矩阵M; 调用PrintMatrix函数输出邻接矩阵M 调用CreateMGtoDN函数,由邻接矩阵M创建邻接表G 调用PrintDN函数输出邻接表G 调用CreateDNtoMG函数,由邻接表M创建邻接矩阵N 调用PrintMatrix函数输出邻接矩阵N 3.函数关系调用图: 3.调试分析 (1)在MGraph的定义中有枚举类型 typedef enum{DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向图,无向网} 赋值语句G.kind(int)=M.kind(GraphKind);是正确的,而反过来M.kind=G.kind则是错误的,要加上那个强制转换M.kind=GraphKind(G.kind);枚举类型enum{DG,DN,UDG,UDN} 会自动赋值DG=0;DN=1,UDG=2,UDN=3;可以自动从GraphKind类型转换到int型,但不会自动从int型转换到GraphKind类型

求一个无向图G的连通分量的个数

《数据结构》实验报告 实验内容:(一)判断一个图有无回路 (二)求一个无向图G的连通分量的个数 一、目的和要求(需求分析): 1、了解图的定义和图的存储结构。 2、熟悉掌握图的邻接矩阵和邻接表。 3、理解图的遍历算法---深度优先搜索和广度优先搜索。 4、学会编程处理图的连通性问题。 二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 判断一个图有无回路: 在程序设计中,先必须确定所要创建的图是有向还是无向,是图还是网,其次再根据各自的特点,用连接表来实现创建。 在有向图中,先找出入度为0的顶点,删除与这个顶点相关联的边(出边),将与这些边相关的其它顶点的入度减1,循环直到没有入度为0的顶点。如果此时还有未被删除的顶点,则必然存在环路,否则不存在回路。 无向图则可以转化为: 如果存在回路,则必然存在一个子图,是一个回路。因此回路中所有定点的度>=2。 第一步:删除所有度<=1的顶点及相关边,并将另外与这些边相关的其它顶点的度减1。 第二步:将度数变为1的顶点排入队列,并从该队列中(使用栈)取出一个顶点,并重复步骤一。 如果最后还有未删除的顶点,则存在回路,否则没有。 求一个无向图G的连通分量的个数: 用连接表创建图,对于非连通图,则需从多个顶点出发进行搜索,而每一次从一个新的起始点出发进行搜索过程中得到的顶点访问序列恰为其各个连通分量中的顶点集。所以在设计中,为了统计出无向图中的连通分量个数,则因在其深度优先所搜无向图时对函数DFSTraverse(ALGraph G)调用DFS次数进行统计,其结果便为无向图中连通分量个数。 三、调试和运行程序过程中产生的问题及采取的措施: 在调试和运行求一个无向图G的连通分量的个数程序时,由于执行语句块 void DFSTraverse(ALGraph G)先于void DFS(ALGraph G,int v), 而void DFSTraverse(ALGraph G)内调用了DFS( ),因此计算机无法正确运行,将两者顺序进行了交换,程序便实现了其功能,且运行正常。 四、源程序及注释:

赋权图的最短路与关键路的算法与实现

赋权图的最短路与关键路的算法与实现 摘要:图形是由点和线构成的集合.赋权图的最短路就是任意两个节点之间的权值之和最小的路径.最短路不仅仅指一般地理意义上的距离最短,还可以引申到其它的度量, 如时间、费用、线路容量等.本文介绍了如何求最短路的有效算法: Dijkstra算法.它能求出赋权图的任何两个节点之间权值之和的最小路径. 关键路径通常总是决定项目工期的进度活动序列.它是项目中从发点到收点的最长路径.关键路径法(Critical Path Method,CPM)是一种通过分析哪个活动序列(哪条路线)进度安排的总时差最少来预测项目工期的一门网络分析技术.关键路径法,能推算出项目的最短完成时间和项目各项活动的可能开始和结束时间. 关键词: 图的邻接矩阵; 最短路径; Dijkstra算法; 关键路径

The algorithm and implementation of the Shortest Path and the Critical Path Abstract: Graphics are constituted by the sets of points and lines. The shortest path of the weighted graph is the minimum sum of the weight between any two vertices. The shortest path not only refers to the shortest distance, but also can be extended to other metrics, such as time, cost, line capacity and so on. Dijkstra’s algorithm was the most efficient algorithm for how to find the Shortest Path of weighted graph, which is studied in this paper. Dijkstra’s algorithm was used to calculate the minimum value of weighted graph between any two vertices. The critical path is usually used to obtain the progress of the project in activities. It is the longest path of a project from the starting point to the ending point. The critical path method (Critical Path Method, CPM) which analysis a sequence of the least time in activities or predict (which route) the schedule better. The critical path method can be used to calculate the shortest completion time, starting and ending times in project activities. Keywords: Adjacency matrix of the graph; The Shortest Path; Dijkstra’s algorithm; The Critical Path

图采用邻接矩阵存储结构

图采用邻接矩阵存储结构 #define TRUE 1 #define FALSE 0 #define MAXV 20 typedef int V ertexType; //用顶点编号表示顶点 typedef struct { // 图的定义 int edges[MAXV][MAXV] ; // 边数组 int n, e; //顶点数,弧数 V ertexType vexs[MAXV]; // 顶点信息 } MGraph; 1、创建具有n个顶点e条边的无向图 void CreateUDG(MGraph &G,int n,int e) { int i,j,u,v; G.n=n;G.e=e; /* printf("请输入%d个顶点的编号:\n",n); for(i=0;i

void CreateDG(MGraph &G,int n,int e) { int i,j,u,v; G.n=n;G.e=e; /* printf("请输入%d个顶点的编号:\n",n); for(i=0;i

1一个连通的无向图G

1.一个连通的无向图G,如果它的所有结点的度数都是偶数,那么它具有一条( ) A.汉密尔顿回路 B.欧拉回路 C.汉密尔顿通路 D.初级回路 2.设G是连通简单平面图,G中有11个顶点5个面,则G中的边是( ) A.10 B.12 C.16 D.14 3.在布尔代数L中,表达式(a∧b)∨(a∧b∧c)∨(b∧c)的等价式是( ) A.b∧(a∨c) B.(a∧b)∨(a’∧b) C.(a∨b)∧(a∨b∨c)∧(b∨c) D.(b∨c)∧(a∨c) 4.设i是虚数,·是复数乘法运算,则G=<{1,-1,i,-i},·>是群,下列是G的子群是( ) A.<{1},·> B.〈{-1},·〉 C.〈{i},·〉 D.〈{-i},·〉 5.设Z为整数集,A为集合,A的幂集为P(A),+、-、/为数的加、减、除运算,∩为集合的交 运算,下列系统中是代数系统的有( ) A.〈Z,+,/〉 B.〈Z,/〉 C.〈Z,-,/〉 D.〈P(A),∩〉 6.下列各代数系统中不含有零元素的是( ) A.〈Q,*〉Q是全体有理数集,*是数的乘法运算 B.〈Mn(R),*〉,Mn(R)是全体n阶实矩阵集合,*是矩阵乘法运算 C.〈Z, 〉,Z是整数集, 定义为x xy=xy, ?x,y∈Z D.〈Z,+〉,Z是整数集,+是数的加法运算 7.设A={1,2,3},A上二元关系R的关系图如下: R具有的性质是 A.自反性 B.对称性 C.传递性 D.反自反性 8.设A={a,b,c},A上二元关系R={〈a,a〉,〈b,b〉,〈a,c〉},则关系R的对称闭包S(R)是( ) A.R∪I A B.R C.R∪{〈c,a〉} D.R∩I A 9.设X={a,b,c},Ix是X上恒等关系,要使Ix∪{〈a,b〉,〈b,c〉,〈c,a〉,〈b,a〉}∪R为X上的 等价关系,R应取( ) A.{〈c,a〉,〈a,c〉} B.{〈c,b〉,〈b,a〉} C.{〈c,a〉,〈b,a〉} D.{〈a,c〉,〈c,b〉} 10.下列式子正确的是( ) A. ?∈? B.??? C.{?}?? D.{?}∈? 11.设解释R如下:论域D为实数集,a=0,f(x,y)=x-y,A(x,y):x

邻接矩阵表示图深度广度优先遍历

*问题描述: 建立图的存储结构(图的类型可以是有向图、无向图、有向网、无向网,学生可以任选两种类型),能够输入图的顶点和边的信息,并存储到相应存储结构中,而后输出图的邻接矩阵。 1、邻接矩阵表示法: 设G=(V,E)是一个图,其中V={V1,V2,V3…,Vn}。G的邻接矩阵是一个他有下述性质的n阶方阵: 1,若(Vi,Vj)∈E 或∈E; A[i,j]={ 0,反之 图5-2中有向图G1和无向图G2的邻接矩阵分别为M1和M2: M1=┌0 1 0 1 ┐ │ 1 0 1 0 │ │ 1 0 0 1 │ └0 0 0 0 ┘ M2=┌0 1 1 1 ┐ │ 1 0 1 0 │ │ 1 1 0 1 │ └ 1 0 1 0 ┘ 注意无向图的邻接是一个对称矩阵,例如M2。 用邻接矩阵表示法来表示一个具有n个顶点的图时,除了用邻接矩阵中的n*n个元素存储顶点间相邻关系外,往往还需要另设一个向量存储n个顶点的信息。因此其类型定义如下: VertexType vertex[MAX_VERTEX_NUM]; // 顶点向量 AdjMatrix arcs; // 邻接矩阵 int vexnum, arcnum; // 图的当前顶点数和弧(边)数 GraphKind kind; // 图的种类标志

若图中每个顶点只含一个编号i(1≤i≤vnum),则只需一个二维数组表示图的邻接矩阵。此时存储结构可简单说明如下: type adjmatrix=array[1..vnum,1..vnum]of adj; 利用邻接矩阵很容易判定任意两个顶点之间是否有边(或弧)相联,并容易求得各个顶点的度。 对于无向图,顶点Vi的度是邻接矩阵中第i行元素之和,即 n n D(Vi)=∑A[i,j](或∑A[i,j]) j=1 i=1 对于有向图,顶点Vi的出度OD(Vi)为邻接矩阵第i行元素之和,顶点Vi 的入度ID(Vi)为第i列元素之和。即 n n OD(Vi)=∑A[i,j],OD(Vi)=∑A[j,i]) j=1j=1 用邻接矩阵也可以表示带权图,只要令 Wij, 若或(Vi,Vj) A[i,j]={ ∞, 否则。 其中Wij为或(Vi,Vj)上的权值。相应地,网的邻接矩阵表示的类型定义应作如下的修改:adj:weightype ; {weightype为权类型} 图5-6列出一个网和它的邻接矩阵。 ┌∞31∞∞┐ │∞∞51∞│ │∞∞∞∞∞│ │∞∞6∞∞│ └∞322∞┘ (a)网(b)邻接矩阵 图5-6 网及其邻接矩阵 对无向图或无向网络,由于其邻接矩阵是对称的,故可采用压缩存贮的方法,

应用Dijkstra算法求赋权图最短路径

给出赋权图,如下图所示: 应用Dijkstra 算法,求出顶点A到其它各点的最短距离,MATLAB源程序m文件清单如下: w=[0 1 inf 2 inf inf 1 0 3 4 inf inf inf 3 0 1 2 2 2 4 1 0 3 inf inf inf 2 3 0 2 inf inf 2 inf 2 0];%图的矩阵存储 n=6;%顶点数目 Result=inf(n-1,n+1);%保存寻找第一个顶点到其余顶点最短路径的中间结果 for i=1:n-1 Result(1,i)=w(1,i+1); end for i=2:n-1 ValMin=inf;IndMin=1; for j=1:n-1 if ValMin>Result(i-1,j) ValMin=Result(i-1,j); IndMin=j; end end Result(i-1,n)=IndMin;Result(i-1,n+1)=ValMin; for j=1:n-1 DelFlag=false; for k=1:i-1 if j==Result(k,n) DelFlag=true; end

if DelFlag==false if Result(i-1,j)>Result(i-1,n+1)+w(Result(i-1,n)+1,j+1) Result(i,j)=Result(i-1,n+1)+w(Result(i-1,n)+1,j+1); else Result(i,j)=Result(i-1,j); end end end end ValMin=inf;IndMin=1; for j=1:n-1 if ValMin>Result(n-1,j) ValMin=Result(n-1,j); IndMin=j; end end Result(n-1,n)=IndMin;Result(n-1,n+1)=ValMin; ValueRoute=inf(n-1,n);%保存用标号表示的第一个顶点到其余顶点的最短路径和最短距离 for i=1:n-1 j=1; while Result(j,n)~=i j=j+1; end IndRoute=n-1; ValueRoute(i,IndRoute)=Result(j,n);ValueRoute(i,n)=Result(j,n+1); ValMin=Result(j,n+1);IndMin=Result(j,n);IndRoute=IndRoute-1; while Result(j,n)>1 j=j-1; if Result(j,IndMin)>ValMin; ValueRoute(i,IndRoute)=Result(j,n); IndRoute=IndRoute-1; ValMin=Result(j,n+1); IndMin=Result(j,n); end end end StringRoute.Route='A ';%结构StringRoute的Route域依次临时存储从第一个顶点到其余顶点的最短路径 StringRoute.Distance=0;%结构StringRoute的Route域依次临时存储从第一个顶点到其余顶点的最短距离 k=2; for i=1:n-1 switch ValueRoute(1,i)

求无向连通图的生成树

求无向连通图的生成树

————————————————————————————————作者:————————————————————————————————日期:

求无向连通图的生成树 一、实验目的 ⑴掌握图的逻辑结构 ⑵掌握图的邻接矩阵存储结构 ⑶验证图的邻接矩阵存储及其遍历操作的实现 二、实验内容 (1)建立无向图的邻接矩阵存储 (2)对建立的无向图,进行深度优先遍历 (3)对建立的无向图进行广度优先遍历 三、设计与编码 (1)本实验用到的理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现.cpp : Defines the entry point for the console application. // #include"stdafx.h" #include"Graph.h" #include"iostream.h" int Graph::Find(int key,int &k) { ?int flag=0; ?for(int i=0;i<VertexLen;i++) ?if(A[i].data.key==key){k=i;flag=1;break;}; return flag; }; int Graph::CreateGraph(int vertexnum,Edge *E,int edgenum) {//由边的集合E(E[0]~E[VertexNum-1]),生成该图的邻接表

表示 if(vertexnum<1)return(-1);//参数vertexnum非法int i,front,rear,k; ?Enode *q; ?//先生成不带边表的顶点表--即顶点为孤立顶点集 ?A=newVnode[vertexnum]; if(!A)return(0);//堆耗尽 ?for(i=0;ikey=front; q->Weight=E[i].weight; ??q->next=A[rear].first; ?A[rear].first=q; ?A[rear].data.OutDegree++; A[front].data.InDegree++; ?if(Type>2) { ??q=new Enode;

图的邻接矩阵的建立与输出

#include #include #include #define MAX_VERTEX_NUM 20 typedef int Arc_Type; typedef char VerTex_Type[5]; typedef enum { DG, DN, UDG, UDN }Graph_Kind; typedef struct ArcCell { Arc_Type adj; //Info_Type *info; }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { V erTex_Type vexs[MAX_VERTEX_NUM]; AdjMatrix arcs; int vertex_num; int arc_num; Graph_Kind kind; }MGraph; void Init_MGraph( MGraph &G ) { printf("输入图的定点数:"); scanf("%d", &G.vertex_num ); printf("输入图的边数:"); scanf("%d", &G.arc_num ); printf("输入图的类型(有向图:1 无向图:2 ):"); scanf("%d", &G.kind); int i, j; printf("输入节点向量(定点之间用空格隔开):"); for( i=0; i

求无向连通图的生成树

求无向连通图得生成树 一、实验目得 ⑴掌握图得逻辑结构 ⑵掌握图得邻接矩阵存储结构 ⑶验证图得邻接矩阵存储及其遍历操作得实现 二、实验内容 (1)建立无向图得邻接矩阵存储 (2)对建立得无向图,进行深度优先遍历 (3)对建立得无向图进行广度优先遍历 三、设计与编码 (1)本实验用到得理论知识 (2)算法设计 (3)编码 // 图抽象类型及其实现、cpp : Defines the entry point for the console application、 // #include”stdafx。h” #include”Graph.h" #include”iostream。h” intGraph::Find(int key,int&k) { int flag=0; for(inti=0;i〈VertexLen;i++) ?if(A[i]、data。key==key){k=i;flag=1;break;}; ?return flag; }; int Graph::CreateGraph(int vertexnum,Edge *E,int edge num) {?//由边得集合E(E[0]~E[VertexNum—1]),生成该图得邻接表表示?if(vertexnum<1)return(—1);//参数vertexnum非法 ?int i,front,rear,k;

Enode *q; //先生成不带边表得顶点表-—即顶点为孤立顶点集 A=new Vnode[vertexnum]; ?if(!A)return(0);//堆耗尽 for(i=0;i〈vertexnum;i++) { ?A[i]、data、key=i; ?A[i]、tag=0; ??A[i]、data.InDegree=A[i]、data。OutDegree=A[i]、tag=0; ?A[i]、first=0; }; VertexLen=vertexnum; //在生成边表 ?if(edgenum〈0)return(1);//无边得图 for(i=0;i<edgenum;i++) { ? front=E[i]。Head;rear=E[i]。Tail; ?if(!Find(rear,k) ||!Find(front,k))return(-2);//参数E非法 ?q=new Enode; ?if(!q)return(0); ??q->key=front; q->Weight=E[i]、weight; ? q—>next=A[rear]。first; A[rear]、first=q; A[rear]、data.OutDegree++; ? A[front]、data。InDegree++; if(Type>2) ?{ ?q=new Enode; if(!q)return(0); ??q—〉key=rear; ???q-〉next=A[front]、first; ??A[front]。first=q;

有向赋权图

图论基本概念 重要定义: 有向图:每条边都是有向边的图。 无向图:每条边都是无向边的图。 混合图:既有有向边又有无向边的图。 自回路:一条边的两端重合。 重数:两顶点间若有几条边,称这些边为平行边,两顶点a,b间平行边的条数成为(a,b)的重数。 多重图:含有平行边的图。 简单图:不含平行边和自回路的图。 注意!一条无向边可以用一对方向相反的有向边代替,因此一个无向图可以用这种方法转化为一个有向图。 定向图:如果对无向图G的每条无向边指定一个方向由此得到的有向图D。称为的G定向图. 底图:如果把一个有向图的每一条有向边的方向都去掉,得无向图G称为的D 底图。 逆图:把一个有向图D的每条边都反向由此得到的图称为D的逆图。 赋权图:每条边都赋上了值。 出度:与顶点相连的边数称为该定点的度数,以该定点为始边的边数为出度。入度:以该定点为终边的边数为入度。 特殊!度数为零的定点称为孤立点。度数为一的点为悬挂点。 无向完全图:在阶无向图中如果任何两点都有一条边关连则称此图是无向完全图。Kn 完全有向图:在阶有向图中如果任意两点都有方向相反的有向边相连则称此图为完全有向图。 竟赛图:阶图中如果其底图是无向完全图,则程此有向完全图是竟塞图。 注意!n阶有向完全图的边数为n的平方;无向完全图的边数为n(n-1)/2。 下面介召图两种操作:①删边:删去图中的某一条边但仍保留边的端点。 ②删点:删去图中某一点以及与这点相连的所有边。 子图:删去一条边或一点剩下的图。 生成子图:只删边不删点。 主子图:图中删去一点所得的子图称的主子图。 补图:设为阶间单无向图,在中添加一些边后,可使成为阶完全图;由这些添加边和的个顶点构成的图称为的补图。 重要定理: 定理5.1.1 设图G是具有n个顶点m条边的有向图,其中点集V={v,v, (v) deg+(vi)=deg-(vi)=m 定理5.1.2 设图G是具有n个顶点m条边的无向图,其中点集V={v,v,v, (v) deg(vi)=2m 推论在无向图中,度数为积数的顶点个数为偶数。 通路和富权图的最短通路 1通路和回路 基本概念: 通路的长度:通路中边的条数。

相关文档
最新文档