图论
3 图论
图论在计算机科学、信息科学、人工智能、网络理论、系统工程、控制论、运筹学和经济管理等领域有着广泛的应用。但很多图论问题虽易表达,却难以求解,其中有相当多的图论问题均属NP完全问题。本章主要介绍工程实用简单图论问题的并行算法及其MPI编程实现,包括传递闭包、连通分量、最短路径和最小生成树等。
1.1 传递闭包
设A是一个含N个顶点的有向图G的布尔邻接矩阵(Boolean Adjacent Matrix),即元素a ij=1当且仅当从顶点i到j有一条有向边。所谓A的传递闭包(Transitive Closure),记为A+,是一个N×N的布尔矩阵,其元素b ij=1当且仅当:①i=j;或②从i出发存在有向路径到j,又称为顶点i到j可达。从G的布尔邻接矩阵A求出G的传递闭包,就称为传递闭包问题。
传递闭包问题有很强的应用背景,在科学计算中广泛存在。传递闭包问题的经典解法之一就是利用布尔矩阵的乘法来求解。本节将把这一算法分别在串行和并行机上实现。
1.1.1 传递闭包串行算法
利用布尔矩阵相乘求解传递闭包问题的原理为:对于布尔矩阵(A+I)k中的任一元素b ij,b ij=1表示从i到j存在长度小于等于k的可达路径,否则,b ij=0。显然对于k=1,(A+I)1中b ij=1当且仅当从i到j路径长度为0(i=j)或为1(从i到j存在有向边);(A+I)2中,b ij=1当且仅当从i到j路径长度小于等于2;((A+I)2) 2中,b ij=1当且仅当从i到j路径长度小于等于4,等等。因为任意两点间如果存在可达路径,长度最多为N-1,所以k≥N-1时,(A+I)k 就是所求的传递闭包A+。于是(A+I)矩阵的㏒N次自乘之后所得的矩阵就是所求的传递闭包。
根据前面的叙述,很自然的有下面的传递闭包串行算法15.1,其时间复杂度为O(N3㏒N)。
算法15.1传递闭包串行算法
输入:图G的布尔邻接矩阵A
输出:A的传递闭包M
procedure closure
Begin
(1)读入矩阵A
/* 以下作A = A+I的运算*/
(2)for i=0 to N-1 do
a(i, i) = 1
endfor
/* 以下是A矩阵的㏒N次自乘,结果放入M矩阵;每次乘后,结果写回A矩阵*/
(3)for k=1 to㏒N do
(3.1)for i=0 to N-1 do
for j=0 to N-1 do
s=0
while (s s = s+1 endwhile if s endfor endfor /* 计算结果从M写回A */ (3.2)for i=0 to N-1 do for j=0 to N-1 do a(i, j) = m(i, j) endfor endfor endfor End 1.1.2 传递闭包并行算法 本小节将把上一小节里的算法并行化。在图论问题的并行化求解中,经常使用将N个顶点(或连通分量)平均分配给p个处理器并行处理的基本思想。其中每个处理器分配到n 个顶点,即n=N/p。无法整除时,一般的策略是在尽量均分的前提下,给最后一个处理器分配较少的顶点。为了使算法简明,在本章中,仅在算法的MPI实现中才考虑不能整除的情况。在以后的几节中,N、p、n都具有上面约定的意义,不再多说。 为了并行处理,这里将矩阵(A+I)进行划分,分别交给p个处理器。在每次矩阵乘法的计算中,将N×N的结果矩阵(A+I)2均匀划分成p×p个子块,每块大小为n×n。处理器i 负责计算位于第i子块行上的p个子块。对整个子块行的计算由p次循环完成,每次计算一个子块。每个处理器为了计算一个n×n大小的子块,需要用到源矩阵(A+I)中对应的连续n 行(局部数据a)和连续n列的数据(局部数据b)。计算完成后,各处理器循环交换局部数据b,就可以进行下一个子块的计算了。 于是,总体算法由2层循环构成,外层是矩阵M=A+I的㏒N次自乘,每次首先完成矩阵M的一次自乘,然后将结果写回M;内层是p个子块的计算,每次首先完成各自独立的计算,然后处理器间循环交换局部数据b。算法运行期间,矩阵M的数据作为全局数据由处理器0维护。 根据以上思想,并行算法描述见下面的算法15.2,使用了p个处理器,其时间复杂度为O(N3/p㏒N)。其中myid是处理器编号,下同。 算法15.2传递闭包并行算法 输入:图G的布尔邻接矩阵A 输出:A的传递闭包M procedure closure-parallel Begin /* 由处理器0读入矩阵A到M中,并进行M=M+I运算 对应源程序中readmatrix()函数*/ (1)if myid=0 then (1.1) 读入矩阵A,放入M中 (1.2) for i=0 to N-1 do m(i,i)=1 endfor endif (2)各处理器变量初始化 /* 以下是主循环,矩阵M的㏒N次自乘*/ (3)for i=1 to㏒N par_do /* 以下向各处理器发送对应子块行和列数据 对应源程序中sendmatrix()函数*/ (3.1)for j=1 to p-1 do (ⅰ) 处理器0发送第j个子块行的数据给处理器j,成为j的局部数据a (ⅱ) 处理器0发送第j个子块列的数据给处理器j,成为j的局部数据b endfor /* 以下是各处理器接收接收和初始化局部数据a和b 对应源程序中getmatrix()函数*/ (3.2)处理器0更新自己的局部数据a和b (3.3)处理器1到p-1从处理器0接受数据,作为局部数据a和b /* 以下是乘法运算过程,对应源程序中paramul()函数*/ (3.4)for j=0 to p-1 do (ⅰ) 处理器k计算结果矩阵的子块(k, ((k+j) mod p)) (ⅱ) 各处理器将数据b发送给前一个处理器 (ⅲ) 各处理器从后一个处理器接收数据b endfor /* 以下是各处理器将局部计算结果写回M数组 对应源程序中writeback()函数*/ (3.5)if myid=0 then (ⅰ) 计算结果直接写入矩阵M (ⅱ) 接受其它处理器发送来的计算结果并写入M else 发送计算结果的myid子块行数据给处理器0 endif endfor End MPI源程序请参见所附光盘。 1.2 连通分量 图G的一个连通分量(Connected Component)是G的一个最大连通子图,该子图中每对顶点间均有一条路径。根据图G,如何找出其所有连通分量的问题称为连通分量问题。解决该问题常用的方法有3种:①使用某种形式的图的搜索技术;②通过图的布尔邻接矩阵计算传递闭包;③顶点倒塌算法。本节将介绍如何在并行环境下实现顶点倒塌算法。 1.2.1 顶点倒塌法算法原理描述 顶点倒塌(Vertex Collapse)算法中,一开始图中的N个顶点看作N个孤立的超顶点(Super Vertex),算法运行中,有边连通的超顶点相继合并,直到形成最后的整个连通分量。每个顶 点属于且仅属于一个超顶点,超顶点中标号最小者称为该超顶点的根。 该算法的流程由一系列循环组成。每次循环分为三步:①发现每个顶点的最小标号邻接超顶点;②把每个超顶点的根连到最小标号邻接超顶点的根上;③所有在第2步连接在一起的超顶点倒塌合并成为一个较大的超顶点。 图G的顶点总数为N,因为超顶点的个数每次循环后至少减少一半,所以把每个连通分量倒塌成单个超顶点至多㏒N次循环即可。顶点i所属的超顶点的根记为D(i),则一开始时有D(i)=i,算法结束后,所有处于同一连通分量中的顶点具有相同的D(i)。 1.2.2 连通分量并行算法 算法中为顶点设置数组变量D和C,其中D(i)为顶点i所在的超顶点号,C(i)为和顶点i或超顶点i相连的最小超顶点号等,根据程序运行的阶段不同,意义也有变化。算法的主循环由5个步骤组成:①各处理器并行为每个顶点找出对应的C(i);②各处理器并行为每个超顶点找出最小邻接超顶点,编号放入C(i)中;③修改所有D(i)=C(i);④修改所有C(i)=C(C(i)),运行㏒N次;⑤修改所有D(i)为C(i)和D(C(i))中较小者。其中最后3步对应意义为超顶点的合并。 顶点倒塌算法是专为并行程序设计的,多个顶点的处理具有很强的独立性,很适合分配给多个处理器并行处理。这里让p个处理器分管N个顶点。则顶点倒塌算法的具体描述见算法15.3,使用了p个处理器,其时间复杂度为O(N2/p㏒N),其中步骤(2)为主循环,内含5个子步骤对应上面的描述。 算法15.3 顶点倒塌算法 输入:图G的邻接矩阵A 输出:向量D( 0 :N-1 ),其中D(i)表示顶点i的标识 procedure collapse-vertices Begin /* 初始化 */ (1)for每个顶点i par_do D(i) = i endfor (2)for k=1 to㏒N do /* 以下并行为每个顶点找邻接超顶点中最小的 对应源程序中D_to_C()函数 */ (2.1) for每个i, j : 0 ≤ i, j ≤ N-1 par_do C(i) = min{ D(j) | a(i,j)=1 and D(i)≠D(j) } if没有满足要求的D(j) then C(i) = D(i) endif endfor /* 以下并行求每个超顶点的最小邻接超顶点 对应源程序中C_to_C()函数 */ (2.2) for每个i, j : 0 ≤ i, j ≤ N-1 par_do C(i) = min{ C(j) | D(j)=i and C(j)≠i } if没有满足要求的C(j) then C(i) = D(i) endif endfor (2.3)for每个i : 0 ≤ i ≤ N-1 par_do D(i) = C(i) endfor (2.4)for i=1 to㏒N do /* 以下对应源程序中CC_to_C()函数 */ for每个j : 0 ≤ j ≤ N-1 par_do C(j) = C(C(j)) endfor endfor /* 以下对应源程序中CD_to_D()函数 */ (2.5)for每个i : 0 ≤ i ≤ N-1 par_do D(i) = min{ C(i), D(C(i)) } endfor endfor End MPI源程序请参见章末附录。 1.3 单源最短路径 单源最短路径(Single Source Shortest Path)问题是指求从一个指定顶点s到其它所有顶点i之间的距离,因为是单一顶点到其它顶点的距离,所以称为单源。设图G(V,E)是一个有向加权网络,其中V和E分别为顶点集合和边集合,其边权邻接矩阵为W,边上权值w(i,j) > 0,i,j∈V,V={0,1,…,N-1}。 设dist( i )为最短的路径长度,即距离,其中s∈V且i≠s。这里采用著名的Dijkstra算法,并将其并行化。 1.3.1 最短路径串行算法 Dijkstra算法(Dijkstra Algorithm)是单源最短路径问题的经典解法之一,基本思想如下。 假定有一个待搜索的顶点表VL,初始化时做:dist(s)←0,dist(i)=∞(i≠s),VL=V。每次从VL(非空集)中选取这样的一个顶点u,它的dist(u)最小。将选出的u点作为搜索顶点,对于其它还在VL内的顶点v,若∈E,而且dist(u)+w(u,v) 算法15.4中给出了最短路径问题的Dijkstra串行算法,其时间复杂度为O(N2)。 算法15.4Dijkstra串行算法 输入:边权邻接矩阵W(约定顶点i,j之间无边连接时w(i,j)=∞,且w(i,i) = 0)、待计算顶点的标号s 输出:dist(0 : N-1),其中dist(i)表示顶点s到顶点i的最短路径(1≤i≤N) procedure Dijkstra Begin (1)dist(s) = 0 (2)for i=0 to N-1 do if i≠s then dist(i) = ∞ endfor (3)VL = V (4)for i=0 to N-1 do (4.1) 从VL中找一个顶点u,使得dist(u)最小 (4.2) for (每个顶点v∈VL) and (∈E) do if dist(u)+w(u,v) endif endfor (5)VL = VL-{u} endfor End 1.3.2 最短路径并行算法 在上一小节串行算法的基础上,这里将其并行化。思路如下: ⑴上述算法的(1)(2)两步中,每个处理器分派n=N/p个节点进行初始化。 ⑵第(4.1)步可以并行化为:首先每个处理器分派 n个节点分别求局部最小值,然后再p个处理器合作求全局最小值,最后再将这一最小值广播出去。p个处理器合作方法如下:当p为偶数时,后p/2个处理器将自己的局部最小值分别发送到对应的前p/2个处理器中,由前p/2个处理器比较出2个局部最小值中相对较小者并保留。当p为奇数时,设p=2h+1,则后h个处理器的值分别发送到前h个处理器中,比较并保留小值。一次这样的循环过后,p个最小值减少了一半,两次后,变为1/4,如此一层一层的比较,㏒P次循环后,就可以得出唯一的全局最小值。 ⑶第(4.2)步可以每个处理器分配n个顶点,然后独立进行更新dist的操作。 根据以上思路,最短路径的并行算法见算法15.5,使用了p个处理器,其时间复杂度为O(N2/p+N㏒p)。这里的实现算法和对应的源程序中,处理器0只进行输入输出工作,不参与任何其它计算;因此实际参加运算的处理器为p-1个,所以有n=N/(p-1);另外,布尔数组bdist用来标记各顶点是否已从VL中取出。 算法15.5 Dijkstra并行算法 输入:边权邻接矩阵W(约定顶点i,j之间无边连接时w(i,j)=∞,且w(i,i) = 0)、待计算顶点的标号s 输出:dist(0 : N-1),其中dist(i)表示顶点s到顶点i的最短路径(1≤i≤N) procedure Dijkstra-parallel Begin /* 以下对应源程序中ReadMatrix()函数*/ (1)处理器0读入边权邻接矩阵W /* 以下初始化dist和bdist数组,对应源程序中Init()函数*/ (2)for每个顶点i par_do if i=s then dist(i) = 0 bdist(i) = TRUE else dist(i) = w(i,s) bdist(i) = FALSE endif endfor /* 以下是算法主循环,对应源程序中FindMinWay()函数*/ (3)for i=1 to N-1 do /* 各处理器找出自己负责范围内未搜索节点中最小的dist */ (3.1) for每个顶点j par_do index = min{ j | bdist(j)=FALSE } num = dist(index) endfor /* 以下各处理器协作对p-1个index求最小*/ (3.2) calnum = p-1 for j=1 to㏒(p-1) par_do if calnum mod 2=0 then //本次循环参加比较的数据个数为偶数 (ⅰ) calnum = calnum/2 (ⅱ) 序号大于calnum的处理器将index和num发送给序号比自己小 calnum的处理器 (ⅲ) 序号小于calnum的处理器(不包含0号)在自己原有的和收到 的两个num之间,比较并保留较小者,同时记录对应的index else //本次循环参加比较的数据个数为奇数 (ⅰ) calnum = (calnum+1)/2 (ⅱ) 序号大于calnum的处理器将index和num发送给序号比自己小 calnum的处理器 (ⅲ) 序号小于calnum的处理器(不包含0号)在自己原有的和收到 的两个num之间,比较并保留较小者,同时记录对应的index endif endfor (3.3) 处理器1广播通知其它处理器自己的num和index /* 以下并行更新*/ (3.4) for每个顶点j par_do if bdist(j)=FALSE then dist(j) = min{ dist(j), num+w(j,index) } endif endfor (3.5) 顶点index对应处理器将对应的bdist(index)更改为TRUE endfor End MPI源程序请参见所附光盘。 1.4 最小生成树 一个无向连通图G的生成树是指满足如下条件的G的子图T:①T和G顶点数相同; ②T有足够的边使得所有顶点连通,同时不出现回路。如果对G的每条边指定一个权值,那么,边权总和最小的生成树称为最小代价生成树,记为MCST(Minimum Cost Spanning Tree),常简称为最小生成树(记为MST)。最小生成树问题就是给定G,找出G的一个最小生成树T的问题。 本节将介绍用于求解MST问题的Sollin算法,并将其实现。 1.4.1 最小生成树串行算法 Sollin算法(Sollin Algorithm)是众多用于求解MST问题的算法之一,其原理为:算法开始时,图中的N个顶点视为一片森林,每个顶点视为一棵树;算法主循环的流程中,森林里每棵树同时决定其连向其它树的最小邻边,并将这些边加入森林中,实现树的合并;循环到森林中只剩一棵树时终止。由于森林中树的数目每次至少减少一半,所以只要㏒N次循环就可以找出MST。 算法中以D(i)为顶点i所在的树的编号,edge(i) 和closet(i)为树i连向其它树的最小邻边和其长度,则Sollin算法的形式描述见算法15.6,其时间复杂度为O(N2㏒N)。 算法15.6 Sollin MST算法 输入:无向图G的边权矩阵W 输出:G的最小生成树的边集合T procedure Sollin-MST Begin /* 以下所有顶点初始化为一棵孤立的树*/ (1)for i=0 to N-1 do D(i) = i endfor (2)T初始化为空集 (3)while |T| < N-1 do /* 以下为各树寻找连向其它树的最小边权*/ (3.1) for 每棵树i do closet(i) = ∞ endfor (3.2) for 图G中每条边(v,u) do if D(v)≠D(u) and w(v,u) (ⅰ) closet(D(v)) = w(v,u) (ⅱ) edge(D(v)) = (v,u) endif endfor /* 以下是树的合并*/ (3.3) for 每棵树i do (ⅰ) (v,u) ←edge(i) (ⅱ) if D(v)≠D(u) then T = T + { (v,u) } 树D(v)和D(u)合并 endif endfor endwhile End 1.4.2 最小生成树并行算法 在上一小节Sollin算法的基础上,本节将其并行化。基本思路是由多个处理器同时负责为多个树查找最短边。为了方便并行处理,各树寻找外连最短边的的任务分两步进行:①所有处理器独立并行为每个顶点找连向其它树的最短边,并将这些数据保存;②各处理器独立并行检索每棵树的各顶点,为整棵树找出外连最短边。注意在以上两步中,处理器间分别按照顶点和树进行分配,对象有了变化。 为了配合算法运行,设置了4个一维数组D、C、J、W:①D(i)为顶点i所在的树的编号,也就是该树中最初的顶点号,初始化为i;②C(i)为离顶点i最近的其它树的编号;③J(i)为对应的顶点号;④W(i)为对应的边权,即距离。以上变量约定对MST并行算法的源程序同样适用。运行期间每个处理器处理n=N/p个顶点或n个连通分量。 各树找出外连最短边后,接下来分3步进行树的合并:①让所有的D(i)=C(i);②对所有i,进行C(i)=C(C(i))运算,并循环㏒N次;③对所有i,更新D(i)为C(i)和D(C(i))中较小者。以上合并过程类似顶点倒塌算法中超顶点的合并。 设MST为输出的最小生成树的邻接矩阵,运行期间由0号处理器维护,则并行算法的描述见算法15.7,使用了p个处理器,其时间复杂度为O(N2/p㏒N)。 算法15.7 并行Sollin MST算法 输入:原始图G的邻接矩阵A 输出:所求最小生成树的邻接矩阵MST procedure Sollin-MST-parallel Begin /* 以下初始化将图初始化为N棵树*/ (1)for每个顶点i par_do D(i) = i endfor (2)while图G未连通do /* 以下各处理器为所负责的顶点找出距离最近的树 对应源程序中D_to_C()函数*/ (2.1) f or每个顶点i par_do (ⅰ) W(i) = MAX (ⅱ) for每个顶点j do if a(i, j)>0 and D(j)≠D(i) and a(i, j) C(i) = D(j) W(i) = a(i,j) J(i) = j endif endfor (ⅲ) if W(i)=MAX then C(i) = D(i) endif endfor /* 以下各处理器为所负责的树找出外连的最短边 对应源程序中C_to_C()函数*/ (2.2) f or每棵树i par_do (ⅰ) tempj = N+1 (ⅱ) tempw = MAX (ⅲ) for每个顶点j do if D(j)=i and C(j)≠i and W(j) C(i) = C(j) tempw = W(j) tempj = j endif endfor (ⅳ) if tempj 通知处理器0将边(tempj, J(tempj))加入MST数组 endif endfor (2.3) f or i=0 to N-1 par_do D(i) = C(i) endfor (2.4) f or i=1 to㏒N do /* 以下对应源程序中CC_to_C()函数*/ for j=0 to N-1 par_do C(j) = C(C(j)) endfor endfor /* 以下对应源程序中CD_to_D()函数*/ (2.5) f or i=0 to N-1 par_do D(i) = min{ C(i), D(C(i)) } endfor endwhile End MPI源程序请参见所附光盘。 1.5 小结 本章针对传递闭包、连通分量、单源最短路径、最小生成树等4个经典图论问题,分别介绍了它们的一种典型算法,以及在MPI并行环境下的算法实现。其中除连通分量外,其它3个问题的并行算法实现均由串行算法并行化而得到;通过这3个问题,较为详细的介绍了图论问题串行解法并行化的一般思路:均匀数据划分,独立计算。如何划分才能尽量做到计算的独立,是划分的关键。在最小生成树Sollin算法的并行化中,甚至在程序运行中按照不同的对象对数据进行了划分。 除了常见的串行算法并行化之外,本章还通过连通分量问题的解法,接触了根据并行机特点,直接为并行环境设计的图论问题解法。这种情况在非数值算法问题中并非特例。 本章的编写主要参考了文献[1]。其中,并行传递闭包和连通分量算法也可以参见文献[2],单源最短路径Dijkstra算法也可以参见文献[3],而最小生成树Sollin算法也可以参见文献[4]。 参考文献 [1].陈国良编著.并行算法的设计与分析(修订版).高等教育出版社,2002.11 [2].Hirschberg D S. Parallel Algorithms for Transitive Closure and the Connected Component Problem. Proc. 8th Annu. ACM STOC, New York, 1976,55-57 [3].Dijkstra E. A Note on Two Problems in Connetion with Graphs. Numerische Mathematic, 1959,1:269-271 [4].Goodman S E and Hedetnimi S T ed. Introduction to the Design and Analysis of Algorithms(in An Algorithm Attributed to Sollin). McGraw-Hill, New York, 1977 附录连通分量并行算法的MPI源程序 1. 源程序connect.c /*本算法中处理器数目须小于图的顶点数*/ #include #include #include #include #include /*使用动态分配的内存存储邻接矩阵,以下为宏定义*/ #define A(i,j) A[i*N+j] /*以下为 N:顶点数 n:各处理器分配的顶点数 p:处理器数*/ int N; int n; int p; int *D,*C; int *A; int temp; int myid; MPI_Status status; /*输出必要信息*/ void print(int *P) { int i; if(myid==0) { for(i=0;i printf("%d ",P[i]); printf("\n"); } } /*读入邻接矩阵*/ void readA() { char *filename; int i,j; printf("\n"); printf("Input the vertex num:\n"); scanf("%d",&N); n=N/p; if(N%p!=0) n++; A=(int*)malloc(sizeof(int)*(n*p)*N); if(A==NULL){ printf("Error when allocating memory\n"); exit(0); } printf("Input the adjacent matrix:\n"); for(i=0;i for(j=0;j scanf("%d",&A(i,j)); for(i=N;i for(j=0;j A(i,j)=0; } /*处理器0广播特定数据*/ void bcast(int *P) { MPI_Bcast(P,N,MPI_INT,0, MPI_COMM_WORLD); } /*两者中取最小的数学函数*/ int min(int a,int b) { return(a } /*为各顶点找最小的邻接超顶点,对应算法步骤 (2.1)*/ void D_to_C() { int i,j; for(i=0;i C[n*myid+i]=N+1; for(j=0;j if((A(i,j)==1) &&(D[j]!=D[n*myid+i]) &&(D[j] C[n*myid+i]=D[j]; } if(C[n*myid+i]==N+1) C[n*myid+i]=D[n*myid+i]; } } /*为各超顶点找最小邻接超顶点,对应算法步骤(2.2)*/ void C_to_C() { int i,j; for(i=0;i temp=N+1; for(j=0;j if((D[j]==n*myid+i) &&(C[j]!=n*myid+i) &&(C[j] temp=C[j]; } if(temp==N+1) temp=D[n*myid+i]; C[myid*n+i]=temp; } } /*调整超顶点标识*/ void CC_to_C() { int i; for(i=0;i C[myid*n+i]=C[C[myid*n+i]]; } /*产生新的超顶点,对应算法步骤(2.5)*/ void CD_to_D() { int i; for(i=0;i D[myid*n+i]= min(C[myid*n+i],D[C[myid*n+i]]); } /*释放动态内存*/ void freeall() { free(A); free(D); free(C); } /*主函数*/ void main(int argc,char *argv) { int i,j,k; double l; int group_size; /*以下变量用来记录运行时间*/ double starttime,endtime; MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD, &group_size); MPI_Comm_rank(MPI_COMM_WORLD, &myid); p=group_size; MPI_Barrier(MPI_COMM_WORLD); if(myid==0) starttime=MPI_Wtime(); /*处理器0读邻接矩阵*/ if(myid==0) readA(); MPI_Barrier(MPI_COMM_WORLD); MPI_Bcast(&N,1,MPI_INT,0, MPI_COMM_WORLD); if(myid!=0){ n=N/p; if(N%p!=0) n++; } D=(int*)malloc(sizeof(int)*(n*p)); C=(int*)malloc(sizeof(int)*(n*p)); if(myid!=0) A=(int*)malloc(sizeof(int)*n*N); /*初始化数组D,步骤(1)*/ for(i=0;i MPI_Barrier(MPI_COMM_WORLD); /*处理器0向其它处理器发送必要数据*/ if(myid==0) for(i=1;i MPI_Send(&A(i*n,0),n*N, MPI_INT,i,i, MPI_COMM_WORLD); else MPI_Recv(A,n*N,MPI_INT, 0,myid,MPI_COMM_WORLD, &status); MPI_Barrier(MPI_COMM_WORLD); l=log(N)/log(2); /*主循环体:算法步骤(2)*/ for(i=0;i if(myid==0) printf("Stage %d:\n",i+1); /*算法步骤(2.1)*/ D_to_C(); MPI_Barrier(MPI_COMM_WORLD); MPI_Gather(&C[n*myid],n,MPI_INT,C, n,MPI_INT,0, MPI_COMM_WORLD); print(C); bcast(C); MPI_Barrier(MPI_COMM_WORLD); /*算法步骤(2.2)*/ C_to_C(); print(C); MPI_Barrier(MPI_COMM_WORLD); MPI_Gather(&C[n*myid],n,MPI_INT,C, n,MPI_INT,0, MPI_COMM_WORLD); MPI_Gather(&C[n*myid],n,MPI_INT,D, n,MPI_INT,0, MPI_COMM_WORLD); MPI_Barrier(MPI_COMM_WORLD); /*算法步骤(2.3)*/ if(myid==0) for(j=0;j D[j]=C[j]; /*算法步骤(2.4)*/ for(k=0;k bcast(C); CC_to_C(); MPI_Gather(&C[n*myid],n, MPI_INT,C,n,MPI_INT,0, MPI_COMM_WORLD); } bcast(C); bcast(D); /*算法步骤(2.5)*/ CD_to_D(); MPI_Gather(&D[n*myid],n, MPI_INT,D,n,MPI_INT,0, MPI_COMM_WORLD); print(D); bcast(D); } if(myid==0) printf("Result: \n"); print(D); if(myid==0){ endtime=MPI_Wtime(); printf("The running time is %d\n", endtime-starttime); } freeall(); MPI_Finalize(); } 2. 运行实例 编译:mpicc connect.c 运行:本实例中使用3个处理器。 mpirun –np 3 a.out 运行结果: Input the vertex num: 8 Input the adjacent matrix: 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 1 0 0 0 最终输出结果: Result: 0 0 2 0 0 0 0 0 说明:使用了和上一小节传递闭包时相同的输入矩阵,得到的结果也相同。除顶点2外,其余顶点构成另一个连通分量 本试卷满分90分 (06级计算机、信息安全专业、实验学院) 一、判断对错(本题满分10分,每小题各1分) ( 正确画“√”,错误画“×”) 1.对每个集合A ,A A 2}{∈。 (×) 2.对集合Q P ,,若?==Q P Q Q P ,,则P =?。 (√) 3.设,,:X A Y X f ?→若)()(A f x f ∈,则A x ∈。 (×) 4.设,,:Y B Y X f ?→则有B B f f ?-))((1。 (×) 5.若R 是集合X 上的等价关系,则2R 也是集合X 上的等价关系。 (√) 6.若:f X Y →且f 是满射,则只要X 是可数的,那么Y 至多可数的。(√) 7.设G 是有10个顶点的无向图,对于G 中任意两个不邻接的顶点u 和v, 均有9deg deg ≥+v u ,则G 是哈密顿图。 (×) 8.设)(ij a A =是 p 个顶点的无向图G 的邻接矩阵,则对于G 的顶点i v , 有∑==p j ij i a v 1deg 成立。 (√) 9. 设G 是一个),(q p 图,若1-≥p q ,则]/2[)(q p G ≤χ。 (×) 10.图G 和1G 同构当且仅当G 和1G 的顶点和边分别存在一一对应关系。(×) 二.填空(本题40分,每空各2分) 1.设}},{,{φφ=S 则=S 2 }}}{,{}},{{},{,{φφφφφ 。 2.设B A ,是任意集合,若B B A =\,则A 与B 关系为 φ==B A 。 3.设1)(,0)()(,:};3,2{},1,0{},,,{===→===c f b f a f Y X f Z Y c b a X , 3)1(,2)0(,:==→g g Z Y g ,则)()(c f g a f g ,分别为 2,3 。 4.设X 和Y 是集合且X m =,Y n =,若n m ≤,则从X 到Y 的单射的 个数为 !m C m n 。 5.设}2,1{},,,2,1{==B n X ,则从X 到Y 的满射的个数为 22-n 。 6.设)}2,4(),1,3(),3,2{()},4,3(),2,2(),2,1{(},4,3,2,1{===S R X ,则 =)(R S R )}2,3(),4,2(),4,1{( 。 7. 设???? ??=???? ??=5123454321,415235432121σσ,则???? ??=235411234521σσ 。 8. 设)},(),,(),,{(},,,,{a c c b b a R d c b a X ==,则 )},(),,(),,(),,(),,(),,(),,(),,(),,{(b c a c a b c b c a b a c c b b a a R =+ 。 9. 设X 为集合且X n =,则X 上不同的自反或对称的二元关系的个数 为 22222222n n n n n n +--+- 。 10.设}}{},{},,{{},,,,{d c b a A d c b a X ==是X 的一个划分,则由A 确定的 X 上的等价关系为 )},(),,(),,(),,(),,(),,{(d d c c a b b a b b a a 。 11.}10,,2,1{ =S ,在偏序关系“整除”下的极大元为 6,7,8,9,10 。 12.给出一个初等函数)(x f ,使得它是从)1,0(到实数集合R 的一一对应, 这个函数为 x ctg π或-x ctg π或)2/(ππ-x tg 。 13. 设G 是),(p p 连通图,则G 的生成树的个数至多为 p 。 图论法用于供水管网水力计算的研究 图论法用于供水管网水力计算的研究 摘要:图论理论是网络分析的主要工具,现用于管网的水力平衡计算,既充分发挥了图论理论的优势,使计算变得简便、迅捷,又可将管网附件加入计算,使结果更准确、更符合实际。文中采用峰阵输入管网结构,使输入数据的工作量大大减少,易于编制程序,计算大型的复杂管网。 关键词:供水管网水力计算图论法 前言 供水管网的水力平衡计算是供水系统规划设计、经济评价和运行管理的基础。水力平衡计算的目的就是在确定管径的情况下求出满足连续方程和能量方程的各节点压力水头和各管段流量。目前常用的水力平衡计算方法有哈代-克罗斯法(Hardy-Cross),牛顿-莱福逊法(New ton-Raphson),线性理论法(Linear-Theory),有限元法(Finite Element)等等。所有这些方法各有所长,适用范围各不相同,有的还需人工假设管段流量,使输入数据工作量增大,且未考虑管网附件的影响。本文介绍的图论法将复杂的管网处理为相应的“网络图”,并建立相应的数学模型,用峰阵输入原始数据来描述管网结构,输入的数据量最少,不易出错,易于计算大型的复杂管网。其计算过程可同 时考虑管网附件,如控制阀、加压泵、逆止阀、减压阀等,使计算结果更符合实际。 1 图论原理 将供水管网中的管段概化成一条线段(即图中的边),将有附件的管段看成图中的特殊管段,边与边由节点相连。这样,一个供水系统的管网图就转化为图论中的网络图。而且管道中的水流是有方向的,所以管网图是有向图。 根据以上所述原则,可将图1所示管网系统,转化为图2所示的网络图。 图1 图2 图1中有一水库A,三个给水点B、C、D,Q1表示水库节点供水量,Q2\,Q3\,Q4分别表示B、C、D节点的用水量。管段视为网络图中的对应边,管段的直径、管长、管道流量、摩损系数等作为管段对应边的权。至此,与管网同构的网络图生成了。图中箭头表示各条边的方向,即管段中水流方向。 网络图中节点与边的关联函数可以用完全关联矩阵I4×5表示如式(1)所示。 顶点边的编号 离散数学图论单元测验题 一、单项选择题(本大题共10小题,每小题2分,共20分) 1、在图G = 习题一 作者---寒江独钓 1.证明:在n 阶连通图中 (1) 至少有n-1条边; (2) 如果边数大于n-1,则至少有一条闭迹; (3) 如果恰有n-1条边,则至少有一个奇度点。 证明: (1) 若G 中没有1度顶点,由握手定理: ()2()21v V G m d v n m n m n ∈= ≥?≥?>-∑ 若G 中有1度顶点u ,对G 的顶点数作数学归纳。 当n=2时,结论显然;设结论对n=k 时成立。 当n=k+1时,考虑G-u,它仍然为连通图,所以,边数≥k-1.于是G 的边数≥k. (2) 考虑G 中途径: 121:n n W v v v v -→→→→L 若W 是路,则长为n-1;但由于G 的边数大于n-1,因此,存在v i 与v j ,它们相异,但邻接。于是: 1i i j i v v v v +→→→→L 为G 中一闭途径,于是 也就存在闭迹。 (3) 若不然,G 中顶点度数至少为2,于是由握手定理: ()2()21v V G m d v n m n m n ∈= ≥?≥?>-∑ 这与G 中恰有n-1条边矛盾! 2.(1)2n ?12n 2?12n ?1 (2)2n?2?1 (3) 2n?2 。 证明 :u 1的两个邻接点与v 1的两个邻接点状况不同。所以, 两图不同构。 4.证明下面两图同构。 u 1 v 1 证明:作映射f : v i ? u i (i=1,2….10) 容易证明,对?v i v j ∈E ((a)),有f (v i v j,),=,u i,u j,∈,E,((b)) (1≤ i ≤ 10, 1≤j ≤ 10 ) 由图的同构定义知,图(a)与(b)是同构的。 5.指出4个顶点的非同构的所有简单图。 分析:四个顶点的简单图最少边数为0,最多边数为6,所以 可按边数进行枚举。 (a) v 2 v 3 u 4 u (b) 数学建模中的图论方法 一、引言 我们知道,数学建模竞赛中有问题A和问题B。一般而言,问题A是连续系统中的问题,问题B是离散系统中的问题。由于我们在大学数学教育内容中,连续系统方面的知识的比例较大,而离散数学比例较小。因此很多人有这样的感觉,A题入手快,而B题不好下手。 另外,在有限元素的离散系统中,相应的数学模型又可以划分为两类,一类是存在有效算法的所谓P类问题,即多项式时间内可以解决的问题。但是这类问题在MCM中非常少见,事实上,由于竞赛是开卷的,参考相关文献,使用现成的算法解决一个P类问题,不能显示参赛者的建模及解决实际问题能力之大小;还有一类所谓的NP问题,这种问题每一个都尚未建立有效的算法,也许真的就不可能有有效算法来解决。命题往往以这种NPC问题为数学背景,找一个具体的实际模型来考验参赛者。这样增加了建立数学模型的难度。但是这也并不是说无法求解。一般来说,由于问题是具体的实例,我们可以找到特殊的解法,或者可以给出一个近似解。 图论作为离散数学的一个重要分支,在工程技术、自然科学和经济管理中的许多方面都能提供有力的数学模型来解决实际问题,所以吸引了很多研究人员去研究图论中的方法和算法。应该说,我们对图论中的经典例子或多或少还是有一些了解的,比如,哥尼斯堡七桥问题、中国邮递员问题、四色定理等等。图论方法已经成为数学模型中的重要方法。许多难题由于归结为图论问题被巧妙地解决。而且,从历年的数学建模竞赛看,出现图论模型的频率极大,比如: AMCM90B-扫雪问题; AMCM91B-寻找最优Steiner树; AMCM92B-紧急修复系统的研制(最小生成树) AMCM94B-计算机传输数据的最小时间(边染色问题) CMCM93B-足球队排名(特征向量法) CMCM94B-锁具装箱问题(最大独立顶点集、最小覆盖等用来证明最优性) CMCM98B-灾情巡视路线(最优回路) 等等。这里面都直接或是间接用到图论方面的知识。要说明的是,这里图论只是解决问题的一种方法,而不是唯一的方法。 本文将从图论的角度来说明如何将一个工程问题转化为合理而且可求解的数学模型,着重介绍图论中的典型算法。这里只是一些基础、简单的介绍,目的在于了解这方面的知识和应用,拓宽大家的思路,希望起到抛砖引玉的作用,要掌握更多还需要我们进一步的学习和实践。 图论及其应用答案电子科 大 This model paper was revised by the Standardization Office on December 10, 2020 习题三: 证明:e是连通图G 的割边当且仅当V(G)可划分为两个子集V1和V2,使对任意u ∈V 1及v ∈V 2, G 中的路(u,v)必含e . 证明:充分性: e是G的割边,故G ?e至少含有两个连通分支,设V 1是其中一个连通分支的顶点集,V 2是其余分支的顶点集,对12,u V v V ?∈?∈,因为G中的u ,v不连通, 而在G中u与v连通,所以e在每一条(u ,v )路上,G中的(u ,v )必含e。 必要性:取12,u V v V ∈∈,由假设G中所有(u ,v )路均含有边e,从而在G ?e中不存在从 u与到v的路,这表明G不连通,所以e 是割边。 3.设G 是阶大于2的连通图,证明下列命题等价: (1) G 是块 (2) G 无环且任意一个点和任意一条边都位于同一个圈上; (3) G 无环且任意三个不同点都位于同一条路上。 (1)→(2): G是块,任取G的一点u,一边e,在e边插入一点v,使得e成为两条边,由此得到新图G 1,显然G 1的是阶数大于3的块,由定理,G中的u,v 位于同一个圈上,于是G 1中u 与边e都位于同一个圈上。 (2)→(3): G无环,且任意一点和任意一条边都位于同一个圈上,任取G的点u ,边e ,若u在e 上,则三个不同点位于同一个闭路,即位于同一条路,如u不在e上,由定理,e的两点在同一个闭路上,在e边插入一个点v ,由此得到新图G 1,显然G 1的是阶数大于3的块,则两条边的三个不同点在同一条路上。 (3)→(1): G连通,若G不是块,则G中存在着割点u,划分为不同的子集块V 1, V 2, V 1, V 2无环,12,x v y v ∈∈,点u在每一条(x ,y )的路上,则与已知矛盾,G是块。 7.证明:若v 是简单图G 的一个割点,则v 不是补图G ?的割点。 证明:v是单图G的割点,则G ?v有两个连通分支。现任取x ,y ∈V (G ?v ), 如果x ,y 不在G ?v的同一分支中,令u是与x ,y处于不同分支的点,那么,x ,与y在G ?v的补图中连通。若x ,y在G ?v的同一分支中,则它们在G ?v的补图中邻接。所以,若v是G 的割点,则v不是补图的割点。 12.对图3——20给出的图G1和G2,求其连通度和边连通度,给出相应的最小点割和最小边割。 解:()12G κ= 最小点割 {6,8} 1()2G λ= 最小边割{(6,5),(8,5)} 一、用真值表证明德*摩根律(证明其中一条即可)。 二、设A,B,C是集合,试问在什么条件下(A-B)-C=A-(B-C)?给出证明。 三、设A={a,b,c},问A上有多少种不同的:二元关系?自反关系?对称关系?传递关系?等价关系?偏序关系?良序关系? 四、用花括号和空集来表示1?2(注意?表示集合的叉乘). 五、设R是实数集,Q是有理数集,试构造出R-Q与R之间的双射. 1.简单叙述构造的思路; 2.给出双射f:R-Q -> R 或f:R -> R-Q的严格定义。 2008年期末考题: 一、在有向图中,如果存在从顶点u到顶点v的有向通路,则说u可达v;如果顶点u和顶点v互相可达,则说u双向可达v。回答下列问题: 1.顶点集上的可达关系是不是等价关系?为什么? 2.顶点集上的双向可达关系是不是等价关系?为什么? 3.对于上述两个关系,如果是等价关系,其等价类的导出子图称为什么? 二、一棵树有13个顶点,除了3个2度顶点和若干个树叶之外,其余顶点都是5度。 1.求出5度顶点的个数(写出计算过程); 2.画出所有互不同构的这种树。 三、计算出右图中v1到v4长度为4的通路数(要写出计算过程 的主要步骤),并写出一个最小支配集、一个最大团、一个最小 边覆盖、一个最大匹配。 四、如果一个图中所有顶点度数都为k,则称为k正则图。8阶3 正则简单图一定是平面图吗?一定不是平面图吗?为什么? 五、证明:如果正则简单图G和补图G都是连通图,则G和G中至少有一个是欧拉图。 六、证明:如果n阶(n≥3)简单图G中,对于任何1≤j 习题十 1. 设G是一个(n,m)简单图。证明:,等号成立当且仅当G是完全图。 证明:(1)先证结论: 因为G是简单图,所以G的结点度上限 max(d(v)) ≤ n-1, G图的总点度上限为 max(Σ(d(v)) ≤ n﹒max(d(v)) ≤ n(n-1) 。根据握手定理,G图边的上限为 max(m) ≤ n(n-1)/2,所以。 (2) =〉G是完全图 因为G具有上限边数,假设有结点的点度小于n-1,那么G的总度数就小于上限值,边数就小于上限值,与条件矛盾。所以,G的每个结点的点度都为n-1,G为完全图。 G是完全图 =〉 因为G是完全图,所以每个结点的点度为n-1, 总度数为n(n-1),根据握手定理,图G的边数。■ 2. 设G是一个(n,n+1)的无向图,证明G中存在顶点u,d(u)≥3。证明:反证法,假设,则G的总点度上限为max(Σ(d(u)) ≤2 n,根据握手定理,图边的上限为max(m) ≤2n/2=n。与题设m = n+1,矛盾。因此,G中存在顶点u,d(u)≥3。■ 3.确定下面的序列中哪些是图的序列,若是图的序列,画出一个对应的图来: (1)(3,2,0,1,5); (2)(6,3,3,2,2) (3)(4,4,2,2,4); (4)(7,6,8,3,9,5) 解:除序列(1)不是图序列外,其余的都是图序列。因为在(1)中,总和为奇数,不满足图总度数为偶数的握手定理。 可以按如下方法构造满足要求的图:序列中每个数字ai 对应一个点,如果序列数字是偶数,那么就在对应的点上画ai/2个环,如果序列是奇数,那么在对应的点上画(ai-1)/2个环。最后,将奇数序列对应的点两两一组,添加连线即可。下面以(2)为例说明: (6 , 3, 3, 2, 2 ) 对应图G 的点集合V= { v 1,v 2,v 3,v 4,v 5} 每个结点对应的环数(6/2, (3-1)/2, (3-1)/2, 2/2,2/2) = (3,1,1,1,1) 集合论与图论习题册 软件基础教研室 刘峰 2015.02 第一章 集合及其运算 8P 习题 1. 写出方程2210x x ++=的根所构成的集合。 2.下列命题中哪些是真的,哪些为假 a)对每个集A ,A φ∈; b)对每个集A ,A φ?; c)对每个集A ,{}A A ∈; d)对每个集A ,A A ∈; e)对每个集A ,A A ?; f)对每个集A ,{}A A ?; g)对每个集A ,2A A ∈; h)对每个集A ,2A A ?; i)对每个集A ,{}2A A ?; j)对每个集A ,{}2A A ∈; k)对每个集A ,2A φ∈; l)对每个集A ,2A φ?; m)对每个集A ,{}A A =; n) {}φφ=; o){}φ中没有任何元素; p)若A B ?,则22A B ? q)对任何集A ,{|}A x x A =∈; r)对任何集A ,{|}{|}x x A y y A ∈=∈; s)对任何集A ,{|}y A y x x A ∈?∈∈; t)对任何集A ,{|}{|}x x A A A A ∈≠∈。 答案: 3.设有n 个集合12,,,n A A A 且121n A A A A ???? ,试证:12n A A A === 。 4.设{,{}}S φφ=,试求2S ? 5.设S 恰有n 个元素,证明2S 有2n 个元素。 16P 习题 6.设A 、B 是集合,证明:(\)()\A B B A B B B φ=?= 。 7.设A 、B 是集合,试证A B A B φ=?=?。 9.设A ,B ,C 为集合,证明:\()(\)\A B C A B C = 。 10.设A ,B ,C 为集合,证明:()\(\)(\)A B C A C B C = 。 11.设A ,B ,C 为集合,证明:()\(\)(\)A B C A C B C = 。 12.设A ,B ,C 都是集合,若A B A C = 且A B B C = ,试证B=C 。 15.下列命题是否成立?说明理由(举例)。 (1)(\)\(\)A B C A B C = ;(2)(\)()\A B C A B C = ; (3)\()()\A B C A B B = 。(答案:都不正确) 离散数学图论部分综合练习 1 .设图G = 集合与图论习题 第一章习题 .画出具有个顶点地所有无向图(同构地只算一个). .画出具有个顶点地所有有向图(同构地只算一个). .画出具有个、个、个顶点地三次图. .某次宴会上,许多人互相握手.证明:握过奇数次手地人数为偶数(注意,是偶数). .证明:哥尼斯堡七桥问题无解. .设与是图地两个不同顶点.若与间有两条不同地通道(迹),则中是否有回路? .证明:一个连通地(,)图中≥. .设是一个(,)图,δ()≥[],试证是连通地. .证明:在一个连通图中,两条最长地路有一个公共地顶点. .在一个有个人地宴会上,每个人至少有个朋友(≤≤).试证:有不少于个人,使得他们按某种方法坐在一张圆桌旁,每人地左、右均是他地朋友.b5E2R。 .一个图是连通地,当且仅当将划分成两个非空子集和时,总有一条联结地一个顶点与地一个顶点地边. .设是图.证明:若δ()≥ ,则包含长至少是δ()地回路. .设是一个(,)图,证明: ()≥,则中有回路; ()若≥,则包含两个边不重地回路. .证明:若图不是连通图,则是连通图. .设是个(,)图,试证: ()δ()·δ()≤[()]([()]),若≡,,( ) () δ()·δ()≤[()]·[()],若≡( ) .证明:每一个自补图有或个顶点. .构造一个有个顶点而没有三角形地三次图,其中≥. .给出一个个顶点地非哈密顿图地例子,使得每一对不邻接地顶点和,均有 ≥ .试求中不同地哈密顿回路地个数. .试证:图四中地图不是哈密顿图. .完全偶图,为哈密顿图地充分必要条件是什么? .菱形面体地表面上有无哈密顿回路? .设是一个(≥)个顶点地图.和是地两个不邻接地顶点,并且≥.证明:是哈密顿图当且仅当是哈密顿图. .设是一个有个顶点地图.证明:若>δ(),则有长至少为δ()地路. .证明具有奇数顶点地偶图不是哈密顿图. .证明:若为奇数,则中有()个两两无公共边地哈密顿回路. .中国邮路问题:一个邮递员从邮局出发投递信件,然后返回邮局.若他必须至少一次走过他所管辖范围内地每条街道,那么如何选择投递路线,以便走尽可能少地路程.这个问题是我国数学家管梅谷于年首先提出地,国外称之为中国邮路问题.p1Ean。 ()试将中国邮路问题用图论述语描述出来. ()中国邮路问题、欧拉图问题及最短路问题之间有何联系. 第三章习题 .分别画出具有、、个顶点地所有树(同构地只算一个). .证明:每个非平凡树是偶图. .设是一棵树且Δ()≥,证明:中至少有个度为地顶点. .令是一个有个顶点,个支地森林,证明:有条边. .设是一个个顶点地树.证明:若图地最小度δ()≥,则有一个同构于地子图. .一棵树有个度为地顶点,个度为地顶点,…,个度为地顶点,则有多少个度为地顶点? .设是一个连通图.试证:地子图是地某个生成树地子图,当且仅当 没有回路. .证明:连通图地任一条边必是它地某个生成树地一条边. .设是一个边带权连通图,地每条边均在地某个回路上.试证:若地边地权大于地任一其他边地权,则不在地任一最小生成树中.DXDiT。 . 设(,,)是一个边带权连通图,对任意∈,()≥.试证:地一个生成树是地最小生成树,当且仅当时地任一与地距离为地生成树′′满足条件:在中而不在′′中地边地权()不大于在′′中而不在中地边′地权(′).RTCrp。 .某镇有人,每天他们中地每个人把昨天听到地消息告诉他认识地人.已知任何 消息,只要镇上有人知道,都会经这种方式逐渐地为全镇上所有人知道.试证:可选出个居民代表使得只要同时向他们传达某一消息,经天就会为全镇居民知道.5PCzV。 个顶点地图中,最多有多少个割点? .证明:恰有两个顶点不是割点地连通图是一条路. 离散数学图论部分综合练习 一、单项选择题 1.设图G 的邻接矩阵为 ??? ???? ? ????? ???0101 010******* 11100100110 则G 的边数为( ). A .6 B .5 C .4 D .3 2.已知图G 的邻接矩阵为 , 则G 有( ). A .5点,8边 B .6点,7边 C .6点,8边 D .5点,7边 3.设图G = 图三 7.设有向图(a )、(b )、(c )与(d )如图四所示,则下列结论成立的是 ( ) . 图四 A .(a )是强连通的 B .(b )是强连通的 C .(c )是强连通的 D .(d )是强连通的 应该填写:D 8.设完全图K n 有n 个结点(n ≥2),m 条边,当( )时,K n 中存在欧拉回路. A .m 为奇数 B .n 为偶数 C .n 为奇数 D .m 为偶数 9.设G 是连通平面图,有v 个结点,e 条边,r 个面,则r = ( ). A .e -v +2 B .v +e -2 C .e -v -2 D .e +v +2 10.无向图G 存在欧拉通路,当且仅当( ). A .G 中所有结点的度数全为偶数 B .G 中至多有两个奇数度结点 C .G 连通且所有结点的度数全为偶数 D .G 连通且至多有两个奇数度结点 11.设G 是有n 个结点,m 条边的连通图,必须删去G 的( )条边,才能确定G 的一棵生成树. A .1m n -+ B .m n - C .1m n ++ D .1n m -+ 12.无向简单图G 是棵树,当且仅当( ). A .G 连通且边数比结点数少1 B .G 连通且结点数比边数少1 C .G 的边数比结点数少1 D .G 中没有回路. 二、填空题 1.已知图G 中有1个1度结点,2个2度结点,3个3度结点,4个4度结 点,则G 的边数是 . 2.设给定图G (如图四所示),则图G 的点割 ο ο ο ο c a b f 图论第一次作业 By byh |E(G)|,2|E(G)|2G υυ??≤ ??? ?? ??? 1.1 举出两个可以化成图论模型的实际问题 略 1.2 证明其中是单图 证明:(思路)根据单图无环无重边的特点,所以 最大的情形为任意两个顶点间有一条边相连,即极 端情况为。 ?1.4 画出不同构的一切四顶单图 ?0条边:1条边: ?2条边:3条边: ?4条边:5条边:?6条边: 1.10G?H当且仅当存在可逆映射θ:V G→V H,使得uv∈E G?θuθv∈E H,其中G和H是单图。(证明充分性和必要性) ?必要性 ?若G?H,由定义可得,存在可逆映射θ:V G→V Hφ:E G→E(H)当且仅当ψ G e=uv时,ψHφe=θuθ(v),所以uv∈E G? θuθv∈E H ?充分性 ?定义?:E G→E(H),使得uv∈E G和θuθv∈E(H)一一对应,于是?可逆,且ψ e=uv的充要条件是ψHφe=θuθv,得G?H G 1.12求证(a)?K m ,n =mn,(b)G是完全二分图,则?G≤1 4 v G2 ?(a)对于K m ,n ,将顶集分为X和Y,使得X∪Y=V K m,n, X∩Y= ?,X=m,Y=n,对于X中的每一顶点,都和Y中所有顶点相连,所以?K m,n =mn ?(b)设G的顶划分为X,Y,X=m,Y=v?m,则?G≤ ??K m ,v-m =v?m m≤v2 4 ?证明: ?(a)第一个序列考虑度数7,第二个序列考虑6,6,1 ?(b)将顶点v分成两部分v’和v’’ ?v’ = {v|v= v i, 1≤ i≤ k}, ?v’’ = {v|v= v i, k< i≤ n} ?以v’点为顶的原图的导出子图度数之和小于 ?然后考虑剩下的点贡献给这k个点的度数之和最大可能为 离散数学(图论部分)1-4章习题课 1. 证明:在10个人中,或有3人互相认识,或有4人互不认识。 证:设x为10人中之任意某人,则在余下9人中:(1) x至少认识其中4人,或(2) x至多认识其中3人(即至少不认识其中6人),两者必居其一。 (1) 若此x认识的4人互不相识,命题得证;否则,互相认识的2人加上x 构成互相认识的3人,命题得证。 (2) 若此x不认识的6人中有3人互相认识,命题得证;否则,由 Ramsey(3,3)=6知,此6人中至少有3人互不认识,此3人加上x为互 不认识的4人,命题得证。 2. 设(a) V={a,b,c,d},A={,,,, 二、应用题 题0:(1996年全国数学联赛) 有n (n ≥6)个人聚会,已知每个人至少认识其中的[n /2]个人,而对任意的[n /2]个人,或者其中有两个人相互认识,或者余下的n -[n /2]个人中有两个人相互认识。证明这n 个人中必有3个人互相认识。 注:[n /2]表示不超过n /2的最大整数。 证明 将n 个人用n 个顶点表示,如其中的两个人互相认识,就在相应的两个顶点之间连一条边,得图G 。由条件可知,G 是具有n 个顶点的简单图,并且有 (1)对每个顶点x , )(x N G ≥[n /2]; (2)对V 的任一个子集S ,只要S =[n /2],S 中有两个顶点相邻或V-S 中有 两个顶点相邻。 需要证明G 中有三个顶点两两相邻。 反证,若G 中不存在三个两两相邻的顶点。在G 中取两个相邻的顶点x 1和y 1,记N G (x 1)={y 1,y 2,……,y t }和N G (y 1)={x 1,x 2,……,x k },则N G (x 1)和N G (y 1)不相交,并且N G (x 1)(N G (y 1))中没有相邻的顶点对。 情况一;n=2r :此时[n /2]=r ,由(1)和上述假设,t=k=r 且N G (y 1)=V-N G (x 1),但N G (x 1)中没有相邻的顶点对,由(2),N G (y 1)中有相邻的顶点对,矛盾。 情况二;n=2r+1: 此时[n /2]=r ,由于N G (x 1)和N G (y 1)不相交,t ≥r,k ≥r,所以r+1≥t,r+1≥k 。若t=r+1,则k=r ,即N G (y 1)=r ,N G (x 1)=V-N G (y 1),由(2),N G (x 1)或N G (y 1)中有相邻的顶点对,矛盾。故k ≠r+1,同理t ≠r+1。所以t=r,k=r 。记w ∈V- N G (x 1) ∪N G (y 1),由(2),w 分别与N G (x 1)和N G (y 1)中一个顶点相邻,设wx i0∈E, wy j0∈E 。若x i0y j0∈E ,则w ,x i0, y j0两两相邻,矛盾。若x i0y j0?E ,则与x i0相邻的顶点只能是(N G (x 1)-{y j0})∪{w},与y j0相邻的顶点只能是(N G (y 1)-{x j0})∪{w}。但与w 相邻的点至少是3,故N G (x 1)∪N G (y 1)中存在一个不同于x i0和y j0顶点z 与w 相邻,不妨设z ∈N G (x 1),则z ,w ,x i0两两相邻,矛盾。 题1:已知图的结点集V ={a ,b ,c ,d }以及图G 和图D 的边集合分别为: E (G )={(a ,a ), (a ,b ), (b ,c ), (a ,c )} E (D)={, , -- 本试卷满分90分 (计算机科学与技术学院09级各专业) 一、填空(本题满分10分,每空各1分) 1.设B A ,为集合,则A B B A = )\(成立的充分必要条件是什么?(A B ?) 2.设}2,1{},,,2,1{==Y n X ,则从X 到Y 的满射的个数为多少?(22-n ) 3.在集合}11,10,9,8,4,3,2{=A 上定义的整除关系“|”是A 上的偏序关系, 则 最大元是什么? ( 无 ) 4.设{,,}A a b c =,给出A 上的一个二元关系,使其同时不满足自反性、反自 反性、对称性、反对称和传递性的二元关系。({(,),(,),(,),(,)}R a a b c c b a c =) 5.设∑为一个有限字母表,∑上所有字(包括空字)之集记为*∑,则*∑是 否是可数集? ( 是 ) 6.含5个顶点、3条边的不同构的无向图个数为多少? ( 4 ) 7.若G 是一个),(p p 连通图,则G 至少有多少个生成树? ( 3 ) 8. 如图所示图G ,回答下列问题: (1)图G 是否是偶图? ( 不是 ) (2)图G 是否是欧拉图? ( 不是 ) (3)图G 的色数为多少? ( 4 ) 二、简答下列各题(本题满分40分) 1.设D C B A ,,,为任意集合,判断下列等式是否成立?若成立给出证明,若不 成立举出反例。(6分) (1))()()()(D B C A D C B A ??=? ; (2)()()()()A B C D A C B D ?=??。 解:(1)不成立。例如}{,a c B D A ====φ即可。 (2)成立。(,)x y ?∈()()A B C D ?,有,x A B y C D ∈∈,即 ,,,x A x B y C y D ∈∈∈∈。所以(,),(,)x y A C x y B D ∈?∈?,因此 (,)()()x y A C B D ∈??,从而()()A B C D ??()()A C B D ??。 反之,(,)x y ?∈()()A C B D ??,有,,,x A x B y C y D ∈∈∈∈。即 (,)x y ∈()()A B C D ?,从而()()A C B D ???()()A B C D ?。 图论部分 一、选择题: 1.欧拉回路是(B ) A. 路径 B. 简单回路 C. 既是基本回路也是简单回路 D.既非基本回路也非简单回路 2.哈密尔顿回路是(C ) A. 路径 B. 简单回路 C. 既是基本回路也是简单回路 D.既非基本回路也非简单回路 3.设G 是简单有向图,可达矩阵P(G)刻划下列关系中的是(C ) A 、点与边 B 、边与点 C 、点与点 D 、边与边 4.下列哪一种图不一定是树(C )。 A.无简单回路的连通图 B. 有n 个顶点n-1条边的连通图 C. 每对顶点间都有通路的图 D. 连通但删去一条边便不连通的图 5.下列哪个不是两个图同构的必要条件 A. 结点数目相等 B. 边数相等 C. 度数相同的结点数目相同 D. 两个图都是平面图 6.在有n 个结点的连通图中,其边数(B ) A. 最多有n-1条 B. 至少有n-1条 C. 最多有n 条 D. 至少有n 条 7.下列图为树的是(C )。 A 、>><><><=<},,,,,{},,,,{1d c b a a a d c b a G B 、>><><><=<},,,,,{},,,,{2d c d b b a d c b a G C 、 >><><><=<},,,,,{},,,,{3a c d a b a d c b a G D 、>><><><=<},,,,,{},,,,{4d d c a b a d c b a G 二、填充题: 1、n 阶无向完全图K n 的边数是( 2 ) 1(-n n ),每个结点的度数是(n-1)。 2、n 个结点的有向完全图边数是(n(n-1)),每个结点的度数是(2n-2)。 3、设有向图G = < V ,E >,},,,{4321v v v v V =的邻接矩阵?????? ? ? ?=00 010******* 1010A , 则1v 的入度)(deg 1v - = 3 ,4v 的出度)(deg 4v + =1 ,从2v 到4v 的长度为2的路有 1 条。 4、一棵无向树的顶点数为n ,则其边数为n-1 ,其结点度数之和是2n-2。 5、一个无向图有生成树的充分必要条件是(它是连通图)。 6、设T=〈V,E 〉是一棵树,若|V|>1,则T 中至少存在(2)片树叶。 7、任何连通无向图G 至少有(1)棵生成树,当且仅当G 是(树),G 的生成树只有一棵。 8、设T 是一棵树,则T 是一个连通且(无简单回路)的图。 9、设无向图G 有18条边且每个顶点的度数都是3,则图G 有(12)个顶点。 10、任一有向图中,度数为奇数的结点有(偶数)个。 11、一棵树有2个2度顶点,1 个3度顶点,3个4度顶点,则其1度顶点为(9)。 三、问答题 1、设无向图G= 图论第三次作业 一、第六章 2.证明: 根据欧拉公式的推论,有m ≦l*(n-2)/(l-2), (1)若deg(f)≧4,则m ≦4*(n-2)/2=2n-4; (2)若deg(f)≧5,则m ≦5*(n-2)/3,即:3m ≦5n-10; (3)若deg(f)≧6,则m ≦6*(n-2)/4,即:2m ≦3n-6. 3.证明: ∵G 是简单连通图,∴根据欧拉公式推论,m ≦3n-6; 又,根据欧拉公式:n-m+φ=2,∴φ=2-n+m ≦2-n+3n-6=2n-4. 4.证明: (1)∵G 是极大平面图,∴每个面的次数为3, 由次数公式:2m==3φ, 由欧拉公式:φ=2-n+m, ∴m=2-n+m,即:m=3n-6. (2)又∵m=n+φ-2,∴φ=2n-4. (3)对于3n >的极大可平面图的的每个顶点v ,有()3d v ≥,即对任一一点或者 子图,至少有三个邻点与之相连,要使这个点或子图与图G 不连通,必须把与之相连的点去掉,所以至少需要去掉三个点才能使()(H)w G w G <-,由点连通度的定义知()3G κ≥。 5.证明: 假设图G 不是极大可平面图,那么G 不然至少还有两点之间可以添加一条边e ,使G+e 仍为可平面图,由于图G 满足36m n =-,那么对图G+e 有36m n '=-,而平面图的必要条件为36m n '≤-,两者矛盾,所以图G 是极大可平面图。 6.证明: (1)由()4G δ=知5n ≥当n=5时,图G 为5K ,而5K 为不可平面图,所以6n ≥,(由()4G δ=和握手定理有24m n ≥,再由极大可平面图的性质36m n =-,即可得6n ≥)对于可平面图有()5G δ≤,而6n ≥,所以至少有6个点的度数不超过5. (2)由()5G δ=和握手定理有25m n ≥,再由极大可平面图的性质36m n =-,即可得12n ≥,对于可平面图有()5G δ≤,而12n ≥,所以至少有12个点的度数不超过5. 二、第七章 2.证明: 设n=2k+1,∵G 是Δ正则单图,且Δ>0, ∴m(G)==>k Δ,由定理5可知χˊ(G)=Δ(G)+1.集合论与图论 试题A
图论法用于供水管网水力计算的研究
离散数学测验题--图论部分(优选.)
图论张先迪李正良课后习题答案
数学建模中的图论方法
图论及其应用答案电子科大
北大集合论与图论往年考题.pdf
习题参考解答图论部分
集合论与图论
离散数学图论部分综合练习
哈工大集合与图论习题
离散数学图论部分经典试题及答案
图论 王树禾 答案
离散数学(图论部分)1-4章习题课
图论习题参考答案
哈工大年集合论与图论试卷
图论部分复习题
电子科大图论答案