图论(C++版)
图论算法详解(C++版)

1.1、prim算法:无向图的生成树就是从图的边集中选择一些边,使得这些边构成一个连通无环图,也就是树。
如果给每一条边加一个权,所有生成树中权和最小的生成树称为最小生成树。
【Prim算法思想】任意时刻的中间结果都是一棵树,每次花费最小的代价,用一条边把不在树中的结点加进来。
【最小生成树算法实例】现有一张城市地图,图中的顶点为城市,无向边代表两个城市间的连通关系,边上的权代表公路造价。
在分析了这张图后发现,任一对城市都是连通的。
现在要求用公路把所有城市联系起来,如何设计可使得工程的总造价最少?【输入】第一行两个数v(v<=200),e,分别代表城市数和边数以下e行,每行为两个顶点和它们之间的边权w(w<1000)。
【输出】连通所有城市的公路最小造价。
【输入样例】6 101 2 101 5 191 6 212 3 52 4 62 6 113 4 64 5 184 6 145 6 33【输出样例】50 原图最小生成树#include<cstdio>#include<string>#include<cstring>#include<climits>using namespace std;int i,j,k,n,m,mi,t,s,a[1000][1000]; void prim(){int mi,p,f,k,d[1000];bool v[1000];memset(v,false,sizeof(v));f=1;for (i=2;i<=n;i++){d[i]=INT_MAX;}d[f]=0;s=0;for(i=1;i<=n;i++){mi=INT_MAX;for (j=1;j<=n;j++)if ((v[j]==false) && (d[j]<mi)){p=j;mi=d[j];}s+=mi;v[p]=true;for(j=1;j<=n;j++){if (a[p][j]<d[j]) d[j]=a[p][j];}}}int main(){memset(a,0,sizeof(a));scanf("%d%d",&n,&m);mi=INT_MAX;for (i=1;i<=n;i++){for (j=1;j<=n;j++){a[i][j]=INT_MAX;}}for (i=1;i<=m;i++){scanf("%d%d%d",&k,&j,&t);if ((t<a[k][j])||(t<a[j][k])){a[k][j]=t;a[j][k]=a[k][j];}}prim();printf("%d",s);return 0;}1.2、克鲁斯卡尔算法假设N=(V,{E})是连通网,将N中的边按权值从小到大的顺序排列;①、将n个顶点看成n个集合;②、按权值小到大的顺序选择边,所选边应满足两个顶点不在同一个顶点集合内,将该边放到生成树边的集合中。
第五章 图论

图论可应用于多个领域,如信息论,控制论, 运筹学,运输网络,集合论等(如用关系图来 描述一个关系)。
计算机领域,其可应用于人工智能,操作系统, 计算机制图,数据结构)
§1
图论基本概念
1-1 图的实例 问题1、哥尼斯堡桥问题
A C B D C B A D
问题:一个散步者能否从任一块陆地出发,走过七 座桥,且每座桥只走过一次,最后回到出发点?
同理,结点间按别的对应方式,便都不存在一一对应
关系。
所以G1,G2不同构。
两图同构有必要条件:
(1)结点数相同; (2)边数同; (3)次数相同的结点数目相等。
1-5 多重图与带权图
1.5.1 多重图 定义11、一个结点对对应多条边,称为多重边。
包含多重边的图称为多重图,否则,成为简单图。
如:
如:基本通路:p1,p2,p3.
简单通路:p1,p2,p3,p5,p6. p4,p7既不是基本通路,也不是简单通路。
定义3、起始结点和终止结点相同的通路称为回路。 各边全不同的回路称为简单回路,各点全不同 的回路称为基本回路。
例2、上例中,1到1的回路有: c1: (1,1,),c2: (1,2,1),c3: (1,2,3,1), 1 2
例2、设有四个城市c1,c2,c3,c4;其中c1与c2间, c1与c4间,c2与c3间有高速公路直接相连,用图表 示该事实。 解:G=<V,E>,其中:V={c1,c2,c3,c4}, E={l1,l2,l3}={(c1,c2),(c1,c4),(c2,c3)} 例3、有四个程序p1,p2,p3,p4,其间调用关系为p1 p2, p1 p4,p2 p3,用图表示该事实。 解:G=<V,E>,V={p1,p2,p3,p4}, E={l1,l2,l3}={(p1,p2),(p1,p4),(p2,p3)}
NOIP普与讲座7图基本知识C版

31
2021/4/13
样例
mouse
malform
acm
32
2021/4/13
样例
m acm
m
m
malform
m mouse
33
2021/4/13
模型1
将每个盘子看作一个顶点。 如果盘子B能连接在盘子A后面,那么从A向B连一条有向边。
34
2021/4/13
模型1
问题转化为在图中寻找一条不重复地经过所有顶点的路径,即哈密尔顿路。 但是,求哈密尔顿路是一个十分困难的问题,这样的建模没有给解题带来任何便利。我们必须另辟蹊径。
0 反之
13
2021/4/13
邻接矩阵表示为:
∞ 2 12 10 ∞
2∞8 ∞ 9
12 8 ∞ 6 3
A1=
10 ∞ 6 ∞ 7
∞93 7∞
1
4
2
5
邻接矩阵表示为=
01100
00000
14
2021/4/13
建立带权无向图的领接矩阵
输入样式: 8 1 22 1 3 12 1 4 10 2 38 259 346 353 457
7
2021/4/13
相关概念 哈密尔顿图
周游世界游戏问题
8
2021/4/13
1)定义: 哈密尔顿通路——通过图中每个顶点一次且仅一次的通路。 哈密尔顿回路——通过图中每个顶点一次且仅一次的回路。 哈密尔顿图——存在哈密尔顿回路的图。
2)判定: 遗憾的是至今尚未找到一个判别哈密尔顿回路和通路的充分必要条件。
输入数据: 第一行为n,p(1≤p≤n≤100)。 接下来为n*n的矩阵A,A[i,j]=1表示i区和j区有路相连,反之为0。
图论习题答案

习题一1. 一个工厂为一结点;若两个工厂之间有业务联系,则此两点之间用边相联;这样就得到一个无向图。
若每点的度数为3,则总度数为27,与图的总度数总是偶数的性质矛盾。
若仅有四个点的度数为偶数,则其余五个点度数均为奇数,从而总度数为奇数,仍与图的总度数总是偶数的性质矛盾。
2. 若存在孤立点,则m 不超过K n-1的边数, 故 m <= (n-1)(n-2)/2, 与题设矛盾。
3.4. 用向量(a 1,a 2,a 3)表示三个量杯中水的量, 其中a i 为第i 杯中水的量, i = 1,2,3.以满足a 1+a 2+a 3 = 8 (a 1,a 2,a 3为非负整数)的所有向量作为各结点, 如果(a 1,a 2,a 3)中某杯的水倒满另一杯得到 ( a ’1, a ’2, a ’3 ) , 则由结点到结点画一条有向边。
这样可得一个有向图。
本题即为在此图中找一条由( 8, 0, 0 )到( 4, 4, 0 )的一条有向路,以下即是这样的一条:5. 可以。
7. 同构。
同构的双射如下:8. 记e 1= (v 1,v 2), e 2= ( v 1,v 4), e 3= (v 3,v 1), e 4= (v 2,v 5), e 5= (v 6,v 3), e 6= (v 6,v 4), e 7= (v 5,v 3), e 8= (v 3,v 4), e 9 = (v 6,v 1), 则邻接矩阵为: 关联矩阵为:∑∑∑∑∑∑∑==+====-=++=-==---=--=ni i n i i n i n i n i ni i i n i i n i i i i a a n n a a a n n n a n a v v 1111121212/)1()1(2)1(])1[(。
, 所以 因为 ,+ 的负度数,则为结点的正度数,为结点记-----22 222 i i C a a ⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---------100110000001001000010100010011010100000001001100000111, 001101000100000000001001010000001010⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡( 8, 0, 0 ) ( 5, 3, 0 ) ( 5, 0, 3 ) ( 2, 3, 3 ) ( 2, 5, 1 )(7, 0, 1 ) ( 7, 1, 0 ) ( 4, 4, 0 )( 4, 1, 3 )边列表为:A= (1,1,3,2,6,6,5,3,6), B= (2,4,1,5,3,4,3,4,1). 正向表为:A= (1,3,4,6,6,7,10), B= (2,4,5,1,4,3,3,4,1).习题二1. 用数学归纳法。
C++知识点图论(树)

C++知识点图论(树)⼀:图论的概念图是表⽰物件与物件之间的关系的数学对象,是图论的基本研究对象。
图和以前所学的变量数组栈这类的东西最⼤的不同就是直观,通过⼀个图就可以说明⼏⼗⾏表达式所要表⽰的关系。
最基本的图由点和线构成,⼀个个离散的点代表着研究的对象,它们被称之为结点,⽽把它们串联起来的这些线我们称之为边。
图能够表达晦涩难懂的⽂字,⽤图解题会更为好懂。
图还分为有向图⽆向图之类的,下⽂看题会有涉及。
⼆:图论能⼲的事图论最⼤的作⽤就是搜索,包括BFS和DFS,这叫做图遍历。
⼴搜和深搜是⽤于在图中搜索节点的两种不同算法。
它们通常⽤于确定我们是否可以从给定节点到达某个节点。
BFS的⽬的是尽可能接近根节点遍历图,⽽DFS算法旨在尽可能远离根节点。
最基本的题型精简⼀下就是下边这样从A到B的最短途径是什么?分别从距离和时间⾓度考虑。
有没有办法从C到D?典型的搜索本⼦题叭(以下⼲货时间)三:图论中常⽤的知识点(性质)①连通性任何两个顶点之间都可以通过⼀条路连接,这样的图称为连通的。
相反称为不连通的。
这就像只考虑铁路运输的时候,亚欧⼤陆显然是⼀个连通图(内陆岛屿不算!),⽽由于海洋的存在,它跟美洲⼤陆就挨不到⼀起,他俩放在⼀起就不是⼀个连通的图。
②树树⽐图论学的早真是令⼈匪夷所思,树作为图的⼀种,在代码领域运⽤极其⼴泛。
⼀棵树主要由爸爸和⼉⼦构成...哦不说错了,是⼦节点和⽗节点每个结点有零个或多个⼦结点;没有⽗结点的结点称为根结点;每⼀个⾮根结点有且只有⼀个⽗结点;除了根结点外,每个⼦结点可以分为多个不相交的⼦树这货真画出来根本不像棵树...你要把它倒过来看才能发现被称作树的真谛树⾥⾯最为常⽤的⼀棵(⼀种)就是⼆叉树,主要是因为所有的树经过改造都能变成它...它也因为所解决的问题不同被赋予了不同的名称空⼆叉树//只有⼀个根结点的⼆叉树//只有左⼦树//只有右⼦树//完全⼆叉树对于完全⼆叉树的问题则极为重要,因为它代表着完成⼀个计划的所有情况,搜索和DP往往就在完全⼆叉树中进⾏深度则指的是⼆叉树的⾼度,也就是所谓的家⾥⼏代⼈⽽普通树转⼆叉树,⼀般采⽤左“⼦⼥”右“兄弟”的⽅式来转化,⼀步⼀步对应⾛便可以得到需要的⼆叉树。
图论讲义12 (1)

第八章独立集和团§8.1 独立集°独立集:设S是V的一个子集,若S中任意两个顶点在G中均不相邻,则称S为G的一个独立集。
°最大独立集:G的一个独立集S称为G的最大独立集,是说:G不包含适合S′>S的独立集S′。
°例子:(见图8.1)°覆盖:G的一个覆盖是指V的子集K,使得G的每条边都至少有一个端点属于K。
°例子:在图8.1中,两个独立集都是覆盖的补集。
定理8.1:设S⊆V,则S是G的独立集当且仅当V\S是G的覆盖。
证:按定义,S是G的独立集当且仅当G中每条边的两个端点都不同时属于S,即当且仅当G的每条边至少有一个端点属于V\S,亦即当且仅当V\S是G的覆盖。
∎°独立数:G的最大独立集的顶点数称为G的独立数,记为α(G)。
°覆盖数:G的最小覆盖的顶点数称为G的覆盖数,记为β(G)。
推论8.1:α+β=υ。
证:设S是G的一个最大独立集,K是G的一个最小覆盖。
由定理8.1,V\K是独立集,而V\S是覆盖。
因此υ−β=V\K≤α (8.1)υ−α=V\S≥β (8.2)结合8.1式和(8.2)式,即得α+β=υ。
∎°边覆盖:G的一个边覆盖是指E的一个子集L,使得G的每个顶点都是L中某条边的端点。
°边独立集:即对集。
*注意:边覆盖并不总是存在的,G有边覆盖,当且仅当δ>0。
°边独立数和边覆盖数:最大对集的边数称为边独立数,记作α′G;最小边覆盖的边数称为边覆盖数,记作β′(G)。
*注意:对集的补集不一定是边覆盖,边覆盖的补集也不一定是对集。
定理8.2 (Gallai):若δ>0,则α′+β′=υ。
证:设M是G的一个最大对集,U是M非饱和顶点集。
由于δ>0且M是最大对集,所以存在|U|条边的一个集E′,它的每条边都和U 的每个顶点相关联。
显然,M∪E′是G的边覆盖,因而β′≤M∪E′=α′+υ−2α′=υ−α′即α′+β′≤υ (8.3)再设L是G的一个最小边覆盖,置H=G[L],并且设M是H的一个最大对集。
图论第三章答案

14. 12枚外观相同的硬币,其 中有一枚比其他的或轻 或重.使用决策树描述一个 算法,使得只用一个天 平且最多进行三次比较 就可以确定出坏币并且 判断出它是 轻是重..
解:如下图:
补充:如果连通加权图 G的权值互不相同,则 G有唯一一棵最小生成树 .
证:反证法,设G有T1 , T2 两棵最小生成树,则 T1 , T2的权之和相等, 且存在边e1 , e2 权值不同. 此时e1 T1但e2 T2,e2 T2 但e1 T1 , 令T3 T1 e1 e2,T4 T2 e2 e1,则T3和T4亦是生成树. 由e1,e2的权不同可知:T3或T4中必有一个是权比 T1 ( T2 )小的树,得矛盾 .
11. 根据图回答下列问题 . (a.)对下列每个二进制序列 进行解码. (1)100111101 (2)10001011001(3)10000110110001(4)0001100010110000 (b.)对下列单词进行解码 . (1)den(2)need (3)leaden(4) penned
8. 明下列各题: 1.)若完全二叉树T有m个内点和k个叶子点,则m k 1. 2.)完全二叉树T的边数e,满足e 2(k 1).其中,k为叶子点数.
证: (1.)因为有m个内点的完全二叉树有 2m 1个顶点, 所以由顶点关系得: 2m 1 m k , 则m k 1. (2.)因为树T的边数(e) 顶点数(2m 1) 1, 所以e 2m 2(k 1).
3. 设无向图 G中有n个顶点 m条边,且 m n, 则G中必有圈.
设G有连通分支 T1 , T2 , , Tk (k 1) , 若G中无圈,则 Ti (1 i k ) 也无圈,所以 Ti 是树 .
《图论》第6章-图的着色

6.1 色数
[定理6-1-1] k-临界图 G=(V, E), =min{deg(vi)|viV}, 则
k-1。
[证明]反证法:设 G 是一个 k-临界图且 <k-1。又设v0V, deg(v0)= 。由 k-临界图的定义,Gv0 是 (k1)可着色的, 在一种 k1着色方案下,Gv0 的顶点可按照颜色划分 成 V1,V2, …, Vk-1 共 k1块,块 Vi 中的顶点被涂以颜色 ci。由于deg(v0)< k1,v0 至少与其中一块 Vj 不邻接即与 Vj 中的任何顶点不邻接。此时可将 v0 涂以颜色 cj,
12
第十二页,编辑于星期六:八点 一分。
6.1 色数
[五色定理] (1890, Heaword) 任何简单平面图都是 5-可着色的。 [证明]设简单平面图 G=(V, E),对 n=|V| 作归纳。
n 5时容易讨论结论成立。
设 n = k1时,结论成立。 当 n = k 时,由[定理5-1-8]简单平面图 G 至少有一个顶点的度 小于6。故可设 v0V,deg(v0) 5。设 G=Gv0,由归纳假设
何顶点的度不小于 k-1。又 G 为 k 色图,其中至少有 k 个顶点。
9
第九页,编辑于ቤተ መጻሕፍቲ ባይዱ期六:八点 一分。
6.1 色数
[推论2] 对 G=(V, E), =max{deg(vi)|viV},有 (G) +1。
[证明] 设 (G)=k,由推论1,有 vV,使得 deg(v) k-1
又: deg(v) 故: k-1 或 (G)-1 即: (G) +1
图所示。
13
第十三页,编辑于星期六:八点 一分。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本思想:对图的每个顶点建立一个单链表,存储该顶点所有邻接顶点及其相关 信息。 每一个单链表设一个表头结点。 第i个单链表表示依附于顶点Vi的边(对有向图是以顶点Vi为头或尾的弧)。 图的邻接表存储法,又叫链式存储法。本来是要用链表实现的,但大多数情况下 只要用数组模拟即可。
• 邻接表(有向图) • 邻接表的处理方法是这样: • 图中顶点用一个一维数组存储,当然,顶点也可以用单链表 来存储,不过数组可以较容易地读取顶点信息,更加方便。 • 图中每个顶点Vi的所有邻接点构成一个线性表,由于邻接点 的个数不确定,所以我们选择用单链表来存储。
• 1.二维数组邻接矩阵存储
• • •
基本思想:对于有n个顶点的图,用一维数组vexs[n]存储顶点信息,用二维数组
A[n][n]存储顶点之间关系的信息。该二维数组称为邻接矩阵。在邻接矩阵中,以顶点 在vexs数组中的下标代表顶点,邻接矩阵中的元素A[i][j]存放的是顶点i到顶点j之间关 系的信息。
• 建立邻接矩阵时,有两个小技巧:
• 初始化数组大可不必使用两重for循环。 • 1) 如果是int数组,采用memset(g, 0x7f, sizeof(g))可 全部初始化为一个很大的数(略小于0x7fffffff), • 使用memset(g, 0, sizeof(g)),全部清为0, • 使用memset(g, 0xaf, sizeof(g)),全部初始化为一个很 小的数。 • 2)如果是double数组,采用memset(g,127,sizeof(g));可 全部初始化为一个很大的数1.38*10306, • 使用memset(g, 0, sizeof(g))全部清为0.
简单图:在图结构中,若不存在顶点到其自身的边,且同一条边不重复 出现,则称这样的图为简单图。以下两个则不属于简单图:
稀疏图、稠密图、权
有很少边或弧的图(e<n㏒n)的图称为稀疏图,反之称为稠密图。 权(Weight):与图的边和弧相关的数。权可以表示从一个顶点到 另一个顶点的距离或耗费。带权的图通常称为网(Network)。
下图左侧并不是强连通图,右侧是。并且右侧是左侧的极 大强连通子图,也是左侧的强连通分量。
二、图的存储结构
图的存储结构比较复杂,其复杂性主要表现在: ◆ 任意顶点之间可能存在联系,无法以数据元素在存储区中 的物理位置来表示元素之间的关系。 ◆ 图中顶点的度不一样,有的可能相差很大,若按度数最大 的顶点设计结构,则会浪费很多存储单元,反之按每个顶点自 己的度设计不同的结构,又会影响操作。 图的常用的存储结构有:邻接矩阵、邻接链表、十字链 表、邻接多重表和边表。
对于有向图G=(V,E),如果有<V1,V2>∈E,则称顶点V1邻接到 顶点V2,顶点V2邻接自顶点V1。 以顶点V为头的弧的数目称为V的入度(InDegree),记为ID(V), 以V为尾的弧的数目称为V的出度(OutDegree),记为OD(V), 因此顶点V的度为TD(V)=ID(V)+OD(V)。 下图顶点A的入度是2,出度是1,所以顶点A的度是3。
定义int G[101][101]; G[i][j]的值,表示从点i到点j的边的权值,定义如下:
另外有向图是有讲究的,要考 虑入度和出度,顶点V1的入度 为1,正好是第V1列的各数之 和,顶点V1的出度为2,正好 是第V1行的各数之和。
上图中的3个图对应的邻接矩阵分别如下: 0 1 1 1 0 1 1 G(A)= 1 0 1 1 G(B)= 0 0 1 1 1 0 0 0 1 0 G(C)= 1 1 0 0 ∞ 5 8 ∞ 3 5 ∞ 2 ∞ 6 8 ∞ 3 2 ∞ 6 ∞ 10 4 10 ∞ 11 4 11 ∞
右图用红线列举了从顶点B到顶 点D的四种不同路径:
如果G是有向图,则路径也是有向的。
下图用红线列举顶点B到顶点D的两种路径,而顶点A到顶点B就不存在路径。
路径的长度是路径上的边或弧的数目。 第一个顶点到最后一个顶点相同的路径称为回路或环(Cycle)。
连通图 在无向图G中,如果从顶点V1到顶点V2有路径,则称 V1和V2是连通的,如果对于图中任意两个顶点Vi和Vj 都是连通的,则称G是连通图(ConnectedGraph) 下图左侧不是连通图,右侧是连通图:
• • • • • • • • • • • _edge=0; scanf("%d %d",&n,&m); //读入点数和边数 for(int i=1;i<=m;i++) { scanf("%d %d %d",&a,&b,&x); //a、b之间有一条长度为x的边 add_edge(a,b,x); } for(int i=head[1];i!=0;i=edge[i].next) //遍历从点1开始的所有边 { //... } //...
一、图的定义及其术语 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合 组成,通常表示为:G(V,E),其中,G表示一个图,V是图G 中顶点的集合,E是图G中边的集合。
• 对于图的定义,我们需要明确几个注意的地方: • 线性表中我们把数据元素叫元素,树中叫结点,在图中 数据元素我们则称之为顶点(Vertex)。 • 线性表可以没有数据元素,称为空表,树中可以没有结 点,叫做空树,而图结构在国内大部分的教材中强调顶 点集合V要有穷非空。 • 线性表中,相邻的数据元素之间具有线性关系,树结构 中,相邻两层的结点具有层次关系,而图结构中,任意 两个顶点之间都可能有关系,顶点之间的逻辑关系用边 来表示,边集可以是空的。
无向图中的极大连通子图称为连通分量。 注意以下概念: 首先要是子图,并且子图是要连通的; 连通子图含有极大顶点数; “极大”的含义:指的是对子 图再增加图G中的其它顶点,子图就不再连通。 具有极大顶点数的连通子图包含依附于这些顶点的所有边。
在有向图G中,如果对于每一对Vi到Vj都存在路径,则 称G是强连通图。 有向图中的极大强连通子图称为有向图的强连通分量。
路径(Path)、路径长度、回路(Cycle) : 对无向图G=(V,E),若从顶点vi经过若干条边能到达vj, 称顶点vi和vj是连通的,又称顶点vi到vj有路径。
对有向图G=(V,E),从顶点vi到vj有有向路径,指的 是从顶点vi经过若干条有向边(弧)能到达vj。
在一条路径中,若没有重复相同的顶点,该路径称为简单 路径;第一个顶点和最后一个顶点相同的路径称为回路 (环);在一个回路中,若除第一个与最后一个顶点外,其 余顶点不重复出现的回路称为简单回路(简单环)。
•
• • • • • • • • • • • • • • • • • • • • •
下面是建立图的邻接矩阵的参考程序段:
#include<iostream> using namespace std; int i,j,k,e,n; double g[101][101]; double w; int main() { int i,j; for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) g[i][j] = 0x7fffffff(赋一个超大值); //初始化,对于不带权的图g[i][j]=0,表示没有边 连通。这里用0x7fffffff代替无穷大。 cin >> e; for (k = 1; k <= e; k++) { cin >> i >> j >> w; // 读入两个顶点序号及权值 g[i][j] = w; //对于不带权的图g[i][j]=1 g[j][i] = w; //无向图的对称性,如果是有向图则不要有这句! } „„„„ return 0; }
图论算法 c++
• 一对一和一对多的结构: • 在前边讲解的线性表中,每个元素之间只有一个直接前驱 和一个直接后继,在树形结构中,数据元素之间是层次关 系,并且每一层上的数据元素可能和下一层中多个元素相 关,但只能和上一层中一个元素相关。
• 图结构:是研究数据元素之间的多对多的关系。在这种
结构中,任意两个元素之间可能存在关系。即结点之间的 关系可以是任意的,图中任意元素之间都可能相关。 • 图的应用极为广泛,已渗入到诸如语言学、逻辑学、物理、 化学、电讯、计算机科学以及数学的其它分支。
若是有向图,邻接 表结构就是这样定 义的。
有向图的邻接表: 我们先来看下把顶点当弧尾建立的邻接表,这样 很容易就可以得到每个顶点的出度:
但也有时为了便于确定顶点的入度或以顶点为弧头的弧,我们可以建立一个有向图 的逆邻接表:
此时我们很容易就可以算 出某个顶点的入度或出度 是多少,判断两顶点是否 存在弧也很容易实现。
无序对(A,B) 表示A和B之间的一条边(Edge),因此(A,B) 和(B,A)代表的是同一条边。
有向边:若从顶点Vi到Vj的边有方向,则称这条边为 有向边,也称为弧(Arc),用有序偶数对<Vi,Vj>来表 示,Vi称为弧尾,Vj称为弧头。 •有向图:图中所有顶点间的边均是有向的。
上图G2是一个无向图,G2={V2,E2},其中 V2={A,B,C,D}, E2={<B,A>,<B,C>,<C,A>,<A,D>}
•2.数组模拟邻接表存储 邻接矩阵看上去是个不错的选择,首先是容易理解,第二是索引和编排都很舒服 但是我们也发现,邻接矩阵适合于结点数较少的稠密图。如果用来表示稀疏图, 则会造成很大的空间浪费。 因此我们可以考虑另外一种存储结构方式,例如把数组与链表结合一起来存储, 这种方式在图结构也适用,我们称为邻接表(AdjacencyList)。
图的顶点与边之间的关系
• 对于无向图G=(V,E),如果边(V1,V2)∈E,则称顶点V1 和V2互为邻接点(Adjacent),即V1和V2相邻接。 • 边(V1,V2)依附(incident)于顶点V1和V2,或者说边 (V1,V2)与顶点V1和V2相关联。 • • 顶点V的度(Degree)是和V相关联的边的数目,记为 TD(V),如下图,顶点A与B互为邻接点,边(A,B)依附 于顶点A与B上,顶点A的度为3。