图的遍历及生成树.ppt
第15讲图的遍历
V6
V8
V8
V7
V5 深度优先生成树
V8 V1
V2
V3
V4 V5 V6 V7
V8 广度优先生成树
27
例A
B
CD E
F
GH
I
K
J
L
M
A
D
G
LCF
KI E
H M
JB
深度优先生成森林
28
二、图的连通性问题
▪1、生成树和生成森林
▪ 说明
G
▪ 一个图可以有许多棵不同的生成树
KI
▪ 所有生成树具有以下共同特点:
g.NextAdjVex(v, w))
{
if (g.GetTag(w) == UNVISITED)
{
g.SetTag(w, VISITED);
g.GetElem(w, e);
Visit(e);
q.InQueue(w);
}
}}}
24
一、图的遍历 两种遍历的比较
V0
V1 V4
V0
V1 V4
V3
V2 V5
16
一、图的遍历
广度优先遍历序列?入队序列?出队序列?
V1
V2
V3
V1
V4
V5 V6
V7
V8
遍历序列: V1
17
一、图的遍历
广度优先遍历序列?入队序列?出队序列?
V1
V2
V3
V2 V3
V4
V5 V6
V7
V8
遍历序列: V1 V2 V3
18
一、图的遍历
广度优先遍历序列?入队序列?出队序列?
V1
V2
数据结构第七章-图
*
V0
V7
V6
V5
V4
V3
V2
V1
若图的存储结构为邻接表,则 访问邻接点的顺序不唯一, 深度优先序列不是唯一的
V0
V1
V3
V2
V7
V6
V5
V4
V0,V1,V3,V4,V7,V2,V5,V6,
※求图G以V0为起点的的深度优先序列(设存储结构为邻接矩阵)
void DFSAL(ALGraph G, int i) {/*从第v个顶点出发,递归地深度优先遍历图G*/ /* v是顶点的序号,假设G是用邻接表存储*/ EdgeNode *p; int w; visited[i] =1; Visit(i); /*访问第v个顶点*/ for (p=G.vertices[i].firstarc;p;p=p->nextarc) {w=p->adjvex; /*w是v的邻接顶点的序号*/ if (!visited[w]) DFSAL(G, w); /*若w尚未访问, 递归调用DFS*/ } }/*DFSAL*/
在邻接表存储结构上的广度优先搜索
*
Q
V0
V1
V2
V3
V4
V7
V5
V6
V1
V2
V3
V0
V4
V7
V5
V6
V0
V7
V6
V5
V4
V3
V2
V1
7.3 图的遍历
7
0
1
2
V0
V2
V3
V1
data
firstarc
0
1
^
^
adjvex
next
3
图的遍历及生成树
• •邻接表的DFS算法
void DFS(ALGraph G, int v) { ArcNode *p;
visited[v] = 1; /*置已访问标记*/ printf("%d ", v); /*输出被访问顶点的编号*/ p = G.vertices[v].firstarc; /*p指向顶点v的第一个邻接点*/ while (p!=NULL) {
•v11
•v1,
•v2
•v3
•v2,
•v4,
•v5
•v8,
•v4
•v6
•v7
•v5,
•v3,
•v8
•v6,
•v7
•
•图的DFS算法一般描述
•int visited[MAXVEX]; //访问标志数组
•void DFSTraverse(Graph G)
•{ //对图G作深度优先遍历
• for( v=0; v<G.vexnum; ++v ) visited[v]=FALSE;
•} // DFS1
•G.arcs[v][j] =1
•有邻接点
•visited [n]=0
•未访问过
•
分析:
在遍历图时,对图中每个顶点至多调用一次DFS函数 ,因为一旦某个顶点被标志成已被访问,就不再从它出发 进行搜索。
因此,遍历图的过程实质上是对每个顶点查找其邻接 点的过程。其耗费的时间则取决于所采用的存储结构。 如果用邻接矩阵来表示图,遍历图中每一个顶点都要从 头扫描该顶点所在行,因此遍历全部顶点所需的时间为 O(n2)。 如果用邻接表来表示图,虽然有 2e 个表结点,但只需扫 描 e 个结点即可完成遍历,加上访问 n个头结点的时间, 因此遍历图的时间复杂度为O(n+e)。
第八章 图论8.4树及其应用.ppt
⑥ G中每一对结点之间有惟一一条基本通路。(n≥2)
2017/10/10 82-9
定理4.2.1 分析
直接证明这 6 个命题两两等价工作量太大,一 般采用循环论证的方法,即证明
(1) (2) (3) (4) (5) (6) (1) 然后利用传递行,得到结论。
2017/10/10
证明 TG = <VT, ET> 是 G = <V, E> 的生 分析 必要性:假设 必要性由树的定义即得,充分性利用构造性 成树,由定义 4.2.1 , TG 是连通的,于是 G 也是连通的。 方法,具体找出一颗生成树即可
充分性:假设G = <V, E>是连通的。如果G中无回 路, G 本身就是生成树。如果 G 中存在回路 C1 ,可删除 C1中一条边得到图G1,它仍连通且与G有相同的结点集。 如果G1中无回路,G1就是生成树。如果G1仍存在回路C2, 可删除 C2 中一条边,如此继续,直到得到一个无回路 的连通图H为止。因此,H是G的生成树。
2017/10/10 82-22
思考题
1、一个图的生成树是不是唯一的呢?
2、如果不是唯一的,3个顶点的无向完全图有几棵 生成树?4个顶点的无向完全图又有几棵生成树?n 个顶点的无向完全图又有几棵生成树?
完全图是边数最 多的简单无向图
2017/10/10
82-23
定理4.2.3
一个图G = <V, E>存在生成树TG = <VT, ET>的充分 必要条件是G是连通的。
由定理4.2.1(4) 在结点给定的无向图中, 由定理4.2.1(5) 树是边数最多的无回路图 树是边数最少的连通图 由此可知,在无向图G = (n, m)中, 若m<n-1,则G是不连通的 若m>n-1,则G必含回路
离散数学及其应用课件:树
树
图7-13 二叉树
树
例7.11 计算机中存储的文件目录,目录可以包含子目录
和文件。图7-14用多叉树表示一个文件系统。C表示根目录,
可以表示成根树,内点表示子目录,树叶表示文件或空目录。
树
图7-14 多叉树表示的文件系统
树
2.二叉树的遍历
定义7.10 对于一棵根树的每个结点都访问一次且仅一次
树
图7-16 给定单词二叉搜索树
树
7.2.3 最优二叉树及其应用
1.哈夫曼树
树
例7.14 计算图7-17所示带权二叉树的权值。
图7-17-带权二叉树
树
7.2.1 根树的概念
定义7.6 一个有向图D,如果略去有向边的方向所得的无
向图为一棵无向树,则称D为有向树。换句话说,若有向图的
基图是无向树,那么这个有向图为有向树。入度为0的顶点称
为树根(Root),入度为1且出度为0的顶点称为树叶;入度为1且
出度大于0的顶点称为内点。内点和树根统称为分支点。
有一种特殊结构的有向树叫根树。
图7-2 无向图
树
树
例7.2 设T 是一棵树,它有三个2度结点,两个3度结点,一
个4度结点,求T 的树叶数。
树
7.1.2 生成树的概念与性质
1.生成树的概念
定义7.2 设G=<V,E>是无向连通图,T 是G 的生成子图,并
且T 是树,则称T 是G的生成树(SpanningTree),记为TG 。
树
定理7.1 设G=<V,E>是n 阶无向图,G 中有m 条边,则下面
关于G 是树的命题是等价的:
(1)G 连通而不含回路;
(2)G 的每对顶点之间具有唯一的一条路径;
中科院陈玉福算法课件ch2ppt
A B D E F
C
A B C
B A A B B C C D
C D F H H H H E
0 E 0 G 0 0 0 0 F G 0 0
G
D E
H
F G
图G和它的邻接链表
1 A 2 B 4 D E H 5 6 F G C 7 3
H
1 A 2 B 3 D E H 5 6 F G C 8 7
8
4
图G的宽度优先搜索树
Vertex 1 Vertex 2
2 3 0
4 0 Vertices
Vertex 3 Empty list Edges Vertex 4 2 3 0
1 2 3 4 5 6 7 8 9
(c)
(d)
图的遍历算法
有根树
如果指定树的一个顶点为根,则这棵树称为有根树。在有 根树中,邻接根的顶点称为根的儿子,而根称为这些儿子 的父亲。对于不是根的顶点,除了它的父亲之外其它与之 邻接的顶点都称为该顶点的儿子,该顶点也自然称为它的 这些儿子的父亲。没有儿子的顶点称为叶顶点。 从根到每一个叶顶点都有一条唯一的路,这些路的最长者 的长度称为该树的高度;顶点的高度是以它为根的子树的 高度;顶点的深度是从根顶点到它的路的长度。深度相同 的顶点成为同层的。
⎡1 ⎢1 ⎢ ⎢0 ⎢ M = ⎢0 ⎢0 ⎢ ⎢0 ⎢0 ⎣ 0 1 0 0 0 0⎤ 1 0 0 0 0 0⎥ ⎥ 1 1 0 0 0 0⎥ ⎥ 0 0 1 0 0 0⎥ 0 0 1 1 1 0⎥ ⎥ 0 0 0 1 0 1⎥ 0 0 0 0 1 1⎥ ⎦
右边的图不是连通的,有两个连 通分支。它含有两个圈,不是 树。
算法BFS的复杂性分析
空间复杂度为 S (n, m) = O(n) ; 时间复杂度,当G用邻接矩阵表示时:T (m, m) = O(n 2 ); 当G由邻接链表表示时, T (n, m) = O(n + m) 。 除结点v外,只有当结点w满足Visited(w)=0时才被加到队列上, 然后,Visited(w)的值马上被修改增加1.因此每个结点有一次机 会被放到队列上。需要的队列空间至多是n-1,其余变量所用 的空间为O(1),S(n,m)=O(n)。 在极端情况下,v邻接于全部其 他n-1个结点,此时队列需要n-1的空间。又Visited需要Θ(n)的 空间,所以S(n,m)=Θ(n)。 如果使用邻接链表,语句4的for循环要做d(u)次,而语句3~11的 while循环需要做n次,因而整个循环做∑d(u)=2m次O(1)操 作,又Visited的赋值需要n次操作,因而T(n,m)=Θ(n+m)。 如果采用邻接矩阵,则语句3~11的while循环总共需要做n2次O(1) 操作,Visited赋值需要n操作,因而T(n,m)=Θ(n2)。
生成树算法的三个步骤
生成树算法的三个步骤生成树是图论中的重要概念,它描述了一个连通图的一个子图,该子图包含了图中的所有顶点,并且是无环的。
生成树算法是用来找到一个连通图的生成树的一种方法。
本文将介绍生成树算法的三个步骤:图的遍历、边的选择和生成树的构建。
一、图的遍历图的遍历是生成树算法的第一步,它的目的是将图中的所有顶点访问一遍。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
深度优先搜索是通过递归的方式进行遍历,从某个顶点开始,先访问它的一个邻接顶点,然后再递归地访问该邻接顶点的邻接顶点,直到所有顶点都被访问过。
广度优先搜索是通过队列的方式进行遍历,从某个顶点开始,先访问它的所有邻接顶点,然后再依次访问这些邻接顶点的邻接顶点,直到所有顶点都被访问过。
二、边的选择边的选择是生成树算法的第二步,它的目的是选择一些边,使得这些边构成一个连通图的生成树。
常用的边的选择算法有最小生成树算法和最大生成树算法。
最小生成树算法的目标是选择一些边,使得这些边的权值之和最小。
常用的最小生成树算法有普里姆算法和克鲁斯卡尔算法。
普里姆算法是从一个顶点开始,每次选择一条最小权值的边,将该边连接的顶点加入到生成树中,直到所有顶点都被加入到生成树中。
克鲁斯卡尔算法是先将所有边按照权值从小到大排序,然后依次选择权值最小的边,如果这条边连接的两个顶点不在同一个连通分量中,则将这条边加入到生成树中。
最大生成树算法的目标是选择一些边,使得这些边的权值之和最大。
常用的最大生成树算法有逆克鲁斯卡尔算法和逆普里姆算法。
逆克鲁斯卡尔算法和逆普里姆算法的原理与克鲁斯卡尔算法和普里姆算法相反。
三、生成树的构建生成树的构建是生成树算法的第三步,它的目的是根据选择的边构建一个生成树。
生成树可以用邻接矩阵或邻接表来表示。
邻接矩阵是一个二维数组,其中的元素表示两个顶点之间是否有边。
邻接表是一种链表的数据结构,其中的每个节点表示一个顶点,节点的值表示该顶点的邻接顶点。
第7章 图3图的遍历PPT课件
123
1
AB
E
A
7D C5 G4
7D
23
B
E
C5 G4
6F H
I
89
前进 回退
深度优先搜索过程
6F H
I
89
深度优先搜索树
7
LOGO
•由以上图示过程可知,深度遍历是一个递归的过程
8
voLidOGTOraverseGraph(AdjMatrix *g)/*算法7.3
{ int vi; for(vi=0;vi<g->vexnum;vi++) visited[vi]=False; //访问标志数组初始 for(vi=0;vi<g->vexnum;vi++) //循环调用深度遍历连通子图的操作 if (!visited[vi]) DepthFirstSearch74(g,vi); //若图g是连通图,则此循环 调用函数只执行一次 //DepthFirstSearch75(g,vi); //DepthFirstSearch77(g,vi); //BreadthFirstSearch(g,vi)9; }
w=NextAdjVertex(g,v0,w);
/*找下一个邻接点*/
}}
12
12
B
E
C4 G3
w=3
H
6
void DepthFirstSearch74(AdjMatrix *g, int v0)/*算法7.4, 未具LO体GO展开邻接矩阵(邻接表)的深度优先遍历算法*/
{ int w;
v0=‘A’ v0=‘B’ v0=‘E’ v0=‘G’
visited[v0]=True;
图的遍历(深度优先遍历和广度优先遍历)
遍历规则 从图中某结点v0出发,深度优先遍历(DFS: Depth First Search)图的规则为: 访问v0; 对v0的各个出点v01,v02,…,v0m,每次从它们中按一定方式(也可任选)选取一个未被访问过的结点,从该结点出发按深度优先遍历方式遍历。 然,因为我们没有规定对出点的遍历次序,所以,图的深度优先遍历结果一般不唯一。
20.2 深度优先遍历
例如,对图 20‑1给出的有向图与无向图,一些遍历结果(结点访问次序)为: 左图:从1出发:1,2,4,5;或1,5,2,4 从2出发:2,1,5,4;或2,4,1,5 右图:从a出发:a,b,c,d;或a,b,d,c; … …
A 如果不想让visited或top做为函数参数,也可以在函数中将其定义为static型量。但是,这样的程序是不可再入的,即函数再次被调用时,static型的量也不重新初始化,造成错误!
上面函数中的参数visited和top实质上是中间变量,只是为了避免在递归调用时重新初始化而放在参数表中,造成使用的不方便,为此,做个包装程序: long DFS1(int g[][CNST_NumNodes], long n, long v0, long *resu ) { char *visited; long top=0; visited = new char[n]; for (long i=0; i<n; i++) visited[i]=0; long num=DFS1( g, n, v0, visited, resu, top ); delete visited; return num; }
深度优先遍历非递归算法的一般性描述。
long DFS_NR(图g,结点v0)
单击此处可添加副标题
数据结构:第7章 图3-最小生成树
• 按照生成树的定义,n 个顶点的连通网络的生成树有 n
个顶点、n-1 条边。
即有权图
目标:
在网络的多个生成树中,寻找一个各边权值之和最小的
生成树。
构造最小生成树的准则 ❖ 必须只使用该网络中的边来构造最小生成树;
❖ 必须使用且仅使用n-1条边来联结网络中的n个顶点;
❖ 不能使用产生回路的边。
典型用途:
(b) u={1} w={2,3,4,5,6}
0 6 1 5
6
0
5
3
1 5 0 7 5 4
5
7
0
2
3 5 0 6
4 2 6 0
i
1234
closest[i] 1 1 1 1
lowcost[i] 0 6 1 5
56 11 ∞∞
closest用于存放顶点序号 lowest存放权值
15 4 6
1 25
3
54
5
6
(c ) u={1,3} w={2,4,5,6}
1
1
4
25
6
32
54
5
6
(d) u={1,3,6} w={2,4,5}
i
1234 5 6
closest[i] 1 3 1 1 3 3
lowcost[i] 0 5 0 5 5 4
i
1234 5 6
closest[i] 1 3 1 6 3 3
生
v3 v1
成
树 v4 v2
v1
0^ 1^ 0^ 1^
2.生成森林
若一个图是非连通图或非强连通图,但有若 干个连通分量或若干个强连通分量,则通过 深度优先搜索遍历或广度优先搜索遍历,不 可以得到生成树,但可以得到生成森林,且 若非连通图有 n 个顶点,m 个连通分量或强 连通分量,则可以遍历得到m棵生成树,合 起来为生成森林,森林中包含n-m条树边。
图、邻接矩阵、邻接表、遍历、生成树
例
V1
V2
V3
V4 V5 V6 V7
V8 广度遍历:V1 V2 V3 V4 V5 V6 V7 V8
15
例
V1
V2
V3
V4 V5 V6 V7
V8 广度遍历:V1 V2 V3 V4 V6 V7 V8 V5
以邻接表为存储结构,用广度优先搜索遍历图时,需 要使用一个队列,以类似于按层次遍历二叉树遍历图。 对应的算法如下(其中,v是初始顶点编号):
5
• 连通——从顶点V到顶点W有一条路径,则说V和W是 连通的
• 连通图——图中任意两个顶点都是连通的叫~ • 连通分量——无向图中的极大连通子图 • 强连通图——有向图中,如果对每一对Vi, VjV,
ViVj,从Vi到Vj 和从Vj到 Vi都存在路径,则称G是~ • 强连通分量——有向图中的极大强连通子图称做有向
照某种搜索方法沿着图的边访问图中的所有顶点,使每 个顶点仅被访问一次,这个过程称为图的遍历。
根据搜索方法的不同,图的遍历方法有两种:一种 叫做深度优先搜索法(depth-first search, DFS);另一 种叫做广度优先搜索法(breadth-first search, BFS)。
12
8.3.2 深度优先遍历
– 无向图中,顶点的度为与每个顶点相连的边数 – 有向图中,顶点的度分成入度与出度,顶点的度为二者之和
»入度:以该顶点为头的弧的数目 »出度:以该顶点为尾的弧的数目
3
例
2
2
1
3
1
3
有向完备图 例
245
无向完备图 5
3
6
1
3
6
图与子图 例
例
245
第八章 图(Graph)PPT课件
15
2、邻接表 (Adjacency List)表示法
实际上是一种顺序存储与链式存储相结合的方法。顺序存储 部分用来存储图中顶点的信息,链式部分用来保存图中边 (弧)的信息。
一个一维数组,每个数据元素包含以下信息:
Vertex FirstArc
邻接单链表的每个结点(边结点)的结构如下 AdjVertex Weight NextArc
16
# define MAXNODE <图中结点的最大个数>
typedef struct arc {
int AdjVertex; int Weight; struct arc * NextArc; }arctype; // 邻接链表结点结构
typedef struct {
elemtype Vertext; arctype * FirstArc; }vertextype; // 顺序表结构
在无向图中, 统计第 i 行 (列) 1 的个数可得顶点i 的度。
12
网络的邻接矩阵 W (i,j), 如i果 !j且 <i,jE或 (i,j)E
A.Ed[i]gj[]e= , 否但 则i是 !,=j 0, 对角 i=线 j=
13
用邻接矩阵表示的图的类型的定义
#define MAXNODE 100
✓权 某些图的边具有与它相关的数, 称之为权。这 种带权图叫做网络。
8
7
10 2
5 9
1
12
63
8
15
76
6
3
4
16
7
施工进度图
60
A
B 40 80 C
30
数据结构课件
while (i>0)
{
/*读入顶点对号,建立边表*/
e++;
/*合计边数 */
p = (pointer)malloc(size(struct node));/*生成新旳邻接点序号为j旳表结点*/
p-> vertex = j;
p->next = ga->adlist[i].first;
ga->adlist[i].first = p;
三个强连通分量
第七章 图
权:图旳边具有与它有关旳数, 称之为权。这种带 权图叫做网络。
10
1
6
15
27 5
12
3 76
9
8
6 3
4
16
7
有向权图
60
AB 40 80 C源自307535
D
E
45
无向权图
第七章 图
生成树:连通图G旳一种子图假如是一棵包 括G旳全部顶点旳树,则该子图称为G旳生成
树;显然,n个顶点旳生成树具有n-1条边
scanf (“%d”, &(ga->n));
for (i =1; i<= ga->n; i++)
{
/*读入顶点信息,建立顶点表*/
scanf (“ \n %c”, &( ga->adlist[i].data) )
;
ga->adlist[i].first = NULL; }
e = 0; /*开始建邻接表时,边数为0*/
ga->edges[i][j] = 0;
for (k = 0;k<ga->e;k++) /*读入边旳顶点编号和权值,建立邻接矩阵*/
《图的遍历和连通性》课件
目录 CONTENTS
• 图的遍历 • 图的连通性 • 图的遍历和连通性之间的关系 • 图遍历和连通性的实际应用 • 图遍历和连通性的算法复杂度分析
01
图的遍历
深度优先遍历
深度优先遍历是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索 树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的 起始节点。
计算机视觉和图像处理
图像分割
目标检测
图像拼接
图像增强
在计算机视觉和图像处理领 域,图遍历算法被广泛应用 于图像分割。通过图遍历算 法,可以将图像划分为不同 的区域或对象,便于后续的
识别和分析。
利用图遍历算法,可以对图 像中的目标进行检测和定位 ,为后续的目标跟踪、行为
分析等提供基础数据。
通过图遍历算法,可以将多 张图像拼接成一张完整的图 像,便于全景图的生成和展
关键节点和最短路径等重要信息。
输入 交通标拥题堵优
化
利用图遍历算法,可以分析交通拥堵的原因,找到拥 堵瓶颈路段,为交通管理部门提供优化建议,提高路 网的通行效率和运输能力。
交通路网分 析
路径规划
在物流配送领域,图遍历算法可以帮助企业找到最优 的配送路径,降低运输成本和提高配送效率。
物流配送优 化
通过图遍历算法,可以找到两点之间的最短路径或最 少拥堵路径,为出行者提供路线建议,提高出行效率 和舒适度。
THANK YOU FOR YOUR WATCHING
01
时间复杂度为O(V^3),用于计算所有顶点对之间的最短路径。
Johnson算法
02
时间复杂度为O((V+E)logV),适用于稀疏图,通过预处理计算
图(Graph)是一种比线性表和树更为复杂的数据结构在图形....ppt
第七章
12
权、网、子图
在图的边或弧中给出相关的数,称
15 A 9
为权。 权可以代表一个顶点到另一个顶
11
点的距离、耗费等。带权的图通常称作 B 7 21
E
网。
3 C2F
假设有两个图G=(V,{VR}) 和 图 G=(V,{VR}), 如果 VV且 VRVR, 则称 G 为 G 的子图。
B B
C
A E
第七章
11
完全图、稀疏图、稠密图
假设图中有 n 个顶点,e 条边,则: ❖ 含有 n(n-1)/2 条边的无向图称作完全图; (无向图中边的取 值范围为0~n(n-1)/2) ❖ 含有 n(n-1) 条弧的有向图称作 有向完全图; (有向图中边 的取值范围为0~n(n-1))
❖ 若边或弧的个数 e<n*logn,则称作稀疏图,否则称作稠密 图。(当n很大时,n2>> n*log n)
❖ 生成树是对连通图而言的; ❖ 是连通图的极小连通子图; ❖ 包含图中的所有顶点; ❖ 有且仅有n-1条边。
B A
F
C D
E
第七章
19
7.2 图的存储结构
一、数组表示法(邻接矩阵) 二、邻接表存储表示 三、有向图的十字链表存储表示 四、无向图的邻接多重表存储表示
第七章
20
一、数组表示法(邻接矩阵)
由顶点集和边集构成的图称作无向图(Undigraph)。
例如: G2=(V2, {R2})
B
C
V2={A, B, C, D, E, F} R2={(A,B), (A,E),
(B,E), (B,F),
(C,D), (C,F) ,
A
D
树与生成树
定理1 T是棵完全m叉树, 有t个叶结点, i个分支结点, 则(m-1)i=t -1 . 证明:T的所有结点的出度总和为 mi. 入度总和(i-1)+t. 故 mi=i-1+t 所以(m-1)i=t-1
七. m叉有序树转化成二叉树 因为二叉树便于存贮, 也便于处理, 所以通常可以将多叉 树化成二叉树.方法是: 1.每个结点保留左儿子结点, 剪掉右边其分支. 被剪掉 的结点如下处理(重新嫁接). 2.同一个层次的结点, 从左到右依次画出(被剪掉的结 点 嫁接到它的哥哥结点上).
先将权按照升序排序设为w为儿子结点构造它们的父结点且其权为再与其余权一起排序再从此队列中取出前面两个权值为儿子结点同的方法构造它们的父结点
8-9 树与生成树
树是一种特殊的图, 它是图论中重要的概念之一, 它有 着广泛的应用.在计算机科学中有如判定树、语法树、分 类树、搜索树、目录树等等. 一.树 (Tree) (a) 1.树的定义:一个连通无回路的 无向图T,称之为树. 如(a) 2.叶结点:度数为1的结点, 称为叶结点. (b) 3.分支结点(内结点):度数大于1的结点. 4.森林:一个无向图的每个连通分支都是树.如(b)
⑷ T连通的,且每条边都是割边. ⑸ T连通的且m=n-1. ⑷⑸:关于点数用归纳法证明。 当n=1或2时,T是平凡图或K2,显然有m=n-1。 假设nk时结论成立,往证n=k+1时成立。 当n=k+1时。取T的一条边e,由⑷,e是割边, 所以T-e有两个分支T1和T2, 因为|V(T1)|k, |V(T2)|k, 所以,由归纳假设,有 |E(T1)|=|V(T1)|-1, |E(T2)|=|V(T2)|-1 故m=|E(T1)|+|E(T2)|+1 =|V(T1)|-1+ |V(T2)|-1+1 =n-1。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 每当到达一个其所相邻接的顶点都已被访问过的 顶点,则从最后所访问的顶点开始,依次退回到尚 有邻接顶点末曾访问过的顶点u,并从u开始进行 深序优先搜索…..
• 直到所有顶点都访问过或从任何一个已访问过的 顶点出发,再也无法到达末曾访问过的顶点
int ver2;} E_NODE; L_NODE *head[MAXN]; int visit[MAXN]; E_NODE e[MAXN]; int n,m,u;
void creat_adj_list(head,n,e,m) L_NODE *head[ ]; E_NODE e[ ]; int n,m; {int i,u,v; L_NODE *p; for (i=1;i<=n;i++) head[i]=NULL; for(i=0;i<m;i++) { u=e[i].ver1; v=e[i]=ver2; p=(L_NODE*)moalloc(sizeof(L_NODE)); p->ver=v; p->link=head[u];head[u]=p; p=(L_NODE*)moalloc(sizeof(L_NODE)); p->ver=u; p->link=head[v];head[v]=p;} }
}
求图的连通分量
• 对图的每一个顶点进行检验
– 若被访问过,则该顶点落在已被求出的连通分 量上
– 若末被访问过,则从该顶点出发遍历图,便可 求得图的另一个连通分量
生成树和最小生成树
• 生成树:
设G是一个连通无向图,若G’是包含G中所有 顶点的一个无回路的连通子图,则称G’是G的一棵 生成树
1
2
3
7
4 9
8
16 1
20 11
2 5
19
3
66
22
14
9
4
18
5
最小生成树
• 一个带权连通无向图G的最小生成树是G 的所有生成树中边上的权之和最小的一棵 生成树
• MST性质:
设G(V,E)是一个连通带权的无向图,T=(U,E*) 是正在构造的最小生成树.若边(u,v)的顶点 uU,vV-U,且(u,v)的代价最小,则(u,v)必然存在 于最小生成树
5
6
7
4 9
8
123来自461
2 45
3
86
7
5
9
7
9
8
生成树
• 从G中任一顶点出发,遍历图中的所有顶点,在遍 历过程中,将E分成两个集合T(G)和B(G),其中 T(G)是遍历时所通过的边集,B(G)是剩余的边集, 则G’=(V,T(G))是G的一棵生成树
– dfs生成树
1
– bfs生成树
2
3
5
6
所在的连通分量的所有顶点都有被访问到为止
1
2 5
4 8
3
6
7
9
1 3
4
广度优先搜索法
1 22
2
3
4^
1
3
5^
53 4 5
1
2
1
3
2
3
4
5^
5^
4^
广度优先搜索法
1. 把队列置空 2. 输出出发顶点,置该顶点已被访问的标志 3. 让出发顶点进队 4. 若队列不空,则
– 取出队首中的顶点V – 在邻接表中,依次取得与顶点V邻接的各个顶点 – 转(4)
图的遍历与求图的连通分量
• 图的遍历:
从给定图中任意指定的顶点出发,按照某 种方式系统地访问图中的顶点,使每个顶点仅被 访问一次,所得到的一个序列
• 访问标志位visit[ ]
– 遍历前置visit的各元素为0 – 若顶点vi被访问过,则置visit[i]为1
• 深度优先搜索 广度优先搜索
深度优先搜索
t=t->link;} }
广度优先搜索法
• 首先访问出发点v • 然后访问与顶点v邻接的全部顶点w1,w2,….,wt • 再依次访问与w1,w2,….,wt邻接的全部结点(已访问
过的顶点除外) • 再从这些已访问的顶点出发,依次访问与它们邻接
的全部顶点(已访问的顶点除外) • 依次类推,直到图中所有顶点都访问到或出发顶点V
• 若队列空,则处理过程结束
void bfs(u) int u; {struct queuetype {int qa;
int qe; int item[MAXN];} typedef struct queuetype QTYPE; int v,w; L_NODE *t; QTYPE queue; printf(“%4d”,u); visit[u]=1; queue.qa=0;queue.qe=0 queue.item[0]=u;
void init(n) int n; { int i;
for (i=1;i<=n;i++) visit[i]=0;
}
void dfs(u) int u; { L_NODE *t;
visit[u]=1; printf(“%d”,u); t=head[u]; while(t!=NULL)
{ if (visit[t->ver]= =0) dfs(t->ver);
while(queue.qa<=queue.qe) { v=queue.item[queue.qa++]; t=head[v]; while(t!=NULL) {w=t->ver; if(visit[w]==0) {printf(“%4d”,w); visit[w]=1; queue.item[++queue.qe]=w; } t=t->link; } }
1
2 5
4 8
3
6
7
9
1 3
4
深度优先搜索
1 22
2
3
1
3
53 4 5
1
2
1
3
2
3
4^ 5^
4
5^
5^
4^
#include <stdio.h> #define MAXN 50 #define MAXN 100 struct l_node {int ver;
struct l_node *link;}; typedef struct l_node L_NODE; typedef struct{int ver1;
Prim算法
• 已知G=(V,E)是一个带权连通无向图,顶点V={1,2,….n}, – U为V中构成最小生成树的顶点集合 初始时U={v0},v0是指定的某个顶点,v0V T为构成最小生成树的边的集合,初始时T为空 – 如果(u,v)具有最小代价,且u U,vV-U,则最小生成 树包含边(u,v),即把u加到U中,把(u,v)加入T中 – 这个过程一直进行下去,直到U=V时为止 – 这时T即为所求的最小生成树