图有向图无向图图的概念图的定义图11所示的⑴⑵Word下载.docx
《图有向图无向图图的概念图的定义图11所示的⑴⑵Word下载.docx》由会员分享,可在线阅读,更多相关《图有向图无向图图的概念图的定义图11所示的⑴⑵Word下载.docx(9页珍藏版)》请在冰豆网上搜索。
v2,v1>
是两条不同的边。
图1.3-1中⑴图的顶点集合为:
V={v1,v2,v3,v4}
边集合为:
E={(v1,v2),(v1,v3),(v2,v3),(v2,v4),(v3,v4)}
图1.3-1中⑵图的顶点集合为:
E={<
,<
v1,v3>
v1,v4>
v4,v2>
}
2.图的常用术语
环(cycle):
图1.3-1中⑶图中的v1点本身也有边相连,这种边称为环。
有限图:
顶点与边数均为有限的图,如图1.3-1中的三个图均属于有限图。
简单图:
没有环且每两个顶点间最多只有一条边相连的图,如图1.3-1中的⑴图。
邻接与关联:
当(v1,v2)∈E,或<
∈E,即v1,v2间有边相连时,则称v1和v2是相邻的,它们互为邻接点(adjacent),同时称(v1,v2)或<
是与顶点v1、v2相关联的边。
顶点的度数(degree):
从该顶点引出的边的条数,即与该顶点相关联的边的数目,简称度。
图1.3-1中⑴、⑵图的各顶点的度见下表:
顶点
v1
v2
v3
v4
⑴图
2
3
⑵图
4
1
入度(indegree):
有向图中把以顶点v为终点的边的条数称为是顶点v的入度。
出度(outdegree):
有向图中把以顶点v为起点的边的条数称为是顶点v的出度。
图1.3-1中、⑵图各顶点的入度和出度见下表(各顶点的入度与出度之和为该顶点的度):
入度
出度
0
终端顶点:
有向图中把出度为0的顶点称为终端顶点,如图4.3-1中⑵图的v3。
道路与路长:
道路也称路径(path)。
在图G=(V,E)中,如果存在由不同的边(vi0,vi1),(vi1,vi2),…,(vin-1,vin)或是<
vi0,vi1>
vi1,vi2>
,…,<
vin-1,vin>
)组成的序列,则称顶点vi0,vin是连通的,顶点序列(vi0,vi1,vi2,…,vin)是从顶点vi0到顶点vin的一条道路。
路长是道路上边的数目,vi0到vin的这条道路上的路长为n。
连通图:
对于图中任意两个顶点vi、vj∈V,vi、vj之间有道路相连,则称该图为连通图(connectedgraph),如1.3-1中的⑴图。
带权图:
给图1.3-1中各图的边上附加一个代表性数据(比如表示长度、流量或其他),则称其为带权图,如图1.3-2。
网络:
带权的连通图,如图1.3-2所示。
图1.3-2
二、图的存储
图的最常见的存储方式是用邻接矩阵和邻接表。
1. 邻接矩阵存储
⑴邻接矩阵
邻接矩阵(AdjacencyMatrix)是表示顶点间邻接关系的矩阵。
在图的邻接矩阵表示法中通常用一个邻接矩阵表示顶点间的相邻关系,另外用一个顺序表来存储顶点信息。
具有n个顶点的图G=(V,E)的邻接矩阵可以定义为:
图1.3-1中⑴图和⑵图的邻接矩阵表示为:
带权图的邻接矩阵可以定义为:
图1.3-2邻接矩阵表示为:
⑵建立已知图的邻接矩阵
如要建立图1.3-1中⑴、⑵的已知图,则可用常量数组直接说明如下:
const
graph1:
array[1..4,1..4]ofinteger=((0,1,1,0),(1,0,1,1),(1,1,0,1),(0,1,1,0));
graph2:
array[1..4,1..4]ofinteger=((0,1,1,1),(1,0,0,0),(0,0,0,0),(0,1,0,0));
同样图1.3-2中的图也可用常量数组直接说明如下:
const
graph3:
array[1..4,1..4]ofinteger=((0,3,4,0),(3,0,9,2),(4,9,0,6),(0,2,6,0));
⑶建立任意带权无向图的邻接矩阵
程序如下:
Program
adjmatrix(input,output);
var
vi,vj,vn,ei,en,wn:
integer;
graph:
array[1..20,1..20]ofinteger;
Begin
read(vn,en);
{读入顶点数和边数}
forvi:
=1tovndo
forvj:
graph[vi,vj]:
=0;
forei:
=1toendo
begin
read(vi,vj,wn);
{读入每条边的两个顶点及边上的权值}
=wn;
graph[vj,vi]:
=wn
end;
=1tovndowrite(graph[vi,vj]:
8);
{输出图}
writeln
end
End.
2. 邻接表存储
⑴邻接表
邻接矩阵采用的是顺序存储的方式,而邻接表(AdjacencyList)采用的是图的一种链式存储方式。
邻接表包含了一个顶点顺序表和每个顶点对应的单链表。
顶点顺序表中的顶点与图中的顶点一一对应,每个顶点的单链表中的每个顶点包含了邻接点域(用来指示与该顶点邻接的点在图中的位置),链域(用来指示相邻的另一条边的顶点),数据域(用来存储边的权值等信息)。
三、图的遍历
与树的遍历类似,从图中的某一顶点出发有序访问图中其余的所有顶点,并使每一个顶点恰好被访问一次,这个过程称为是图的遍历(traversinggraph)。
在进行图的遍历时,由于图中顶点间是多对多的关系,图中的任一顶点都可能和其余的顶点相邻接。
为避免重复访问,在遍历图的过程中,必须对访问过的顶点作上标记。
如设置一个辅助的布尔型数组visited[v1..vn],将该数组的初始值设为假,一旦顶点vi被访问,便将其值visited[vi]设为真。
常用的图的遍历方法有两种:
深度优先遍历和广度优先遍历,它们对有向图和无向图均适用。
1. 深度优先遍历
深度优先遍历(Depth-firstTraversal)同树的先序遍历比较类似。
先假设图中的所有顶点均未被访问,遍历时从图中的某个顶点v0出发,访问该顶点,然后依次从v0的未被访问的邻接点出发深度优先遍历图,直到图中所有和v0有路径相通的顶点都被访问到。
如果这时图中还有顶点未被访问,则另选图中一个未被访问的顶点作起始点,重复上述过程,直到图中所有顶点均被访问到为止。
根据深度优先遍历的描述我们可以得到图1.3-4中的⑴图遍历的顶点序列为V1→V2→V4→V8→V9→V5→V3→V6→V7,⑵图遍历的顶点序列为V1→V2→V5→V3→V4→V6。
连通图的深度优先遍历的算法描述如下:
(如果不是连通图则需多次使用遍历算法)
proceduredfs(vi:
integer);
write(graph[vi].v:
4);
{输出顶点数值}
visited[vi]:
=true;
{设置已访问标记}
last:
=graph[vi].link;
{取边表指针}
whilelast<
>
nildo
begin
ifnotvisited[last^.adjv]thendfs(last^.adjv);
=last^.next
end
2. 广度优先遍历
广度优先遍历(Breadth-firstTraversal)也要先假设图中的所有顶点均未被访问,遍历时从某个顶点出发,访问该顶点后再依次访问与该顶点邻接的未被访问过的所有顶点。
然后再分别从这些顶点出发进行广度优先遍历,直到图中所有未被访问过的顶点的相邻顶点均被访问到。
如果这时图中仍有顶点为未被访问,则另选图中一个未被访问的顶点作为起点,再重复上述过程,直到图中所有顶点都被访问到为止。
根据广度优先遍历的描述我们可以得到图1.3-4中的⑴图遍历的顶点序列为V1→V2→V3→V4→V5→V6→V7→V8→V9,⑵图遍历的顶点序列为V1→V2→V3→V4→V5→V6。
在广度优先搜索过程中,设Vi是将被访问的未访问过的顶点。
它的邻接点记为Vi1,Vi2,…,Vin。
访问了Vi后,将对应的visit[Vi]值设为真,并将Vi保存在队列中。
当Vi出队时,搜索其邻接的Vi1,Vi2,…,Vin顶点,然后将其中未被访问的顶点者作上访问标记后放入队列中。
这种方法是将每个已被访问过的顶点入队,保证了每个顶点最多只有一次入队。
四、图的应用
1.一笔画问题
数学家欧拉曾经解决过著名的七桥问题(七桥图见图1.3-5⑴图)。
下面写出七桥问题的描述:
城市中有一条河,河中有A、D两个岛,河上有七座桥来连接两个岛及河的B、C两岸,问:
⑴能否刚好经过每座桥一次,既无重复也无遗漏?
⑵能否经过桥一次后又回到原来出发点上来?
图1.3-5
七桥问题可以画成图1.3-5中的⑵图的形式,这样七桥问题的第一问就转化成了能