与图论相关的算法_new[精选].pptVIP

  • 2
  • 0
  • 约6.31千字
  • 约 46页
  • 2017-01-21 发布于江苏
  • 举报
与图论相关的算法_new[精选]

与图论相关的算法 图的基本概念 G=(V,E) V表示顶点集 E表示边集 无向图和有向图 如果边都是双向的,则这个图叫做无向图。 如果边都是单向的,则这个图叫做有向图。 简单图 环:端点重合为一点的边。 重边:两条边连接同一对顶点。 简单图:没有环和重边的图。 图的基本概念 完全图:边数达到最大值的无向简单图。 顶点的度 无向图中,一个顶点相连的边数称为该顶点的度。 有向图中,从一个顶点出发的边数称为该顶点得出度;到达该顶点的边数称为它的入度。 顶点的最大度数称为图的度数。 路和回路 一个连接两个顶点的,顶点与边交替的序列称为路。 除了起始与终止顶点,其他顶点都不相同,这样的路被称为简单路径。 起始与终止顶点相同的简单路径称为圈。 图的基本概念 子图 连通性 无向图中,如果两个顶点之间存在一条路经,就称这两个顶点是连通的。 有向图中,如果两个顶点之间相互都存在一条路,则称它们是强连通的。 如果一个图的任意两个顶点都是连通的,就称这个图是连通的。 图的基本概念 二分图 二分图的顶点可以分成两个非空集合X和Y,使得每一条边都有一个顶点在集合X里面,另一个顶点在集合Y里面。 完全二分图:特殊的二分图,集合X里面的每一个顶点与集合Y里面的每一个顶点相连。 例题:空中都市 有一些小岛,要架设桥梁。如果A与B之间有桥,B与C之间有桥,则A与C之间不能有桥。要计算最多可以架设几座桥。 输入是一个正整数n(0=n=1000),表示小岛的数量。 图的存储方式(1) 相邻矩阵表示法 相邻矩阵表示的特点: 计算结点的度很方便 可通过矩阵的乘法来判断连通性 存储无向图时,可以节省将近一半的空间 图的存储方式(2) 邻接表表示法 常用于稀疏矩阵 结点信息:出度、访问标志和边表首指针 边信息:另一结点编号、边的权值和下一条边的指针 图的存储方式(2) 邻接表定义: const maxn:=顶点数; type arcptr=^arcnode; arcnode=record v:integer; weight:real; nextarc:arcptr; end; vertexnode=record m:integer; visited:boolean; firstarc:arcptr; end; var map:array[1..maxn] of vertexnode; 图的遍历 深度优先搜索 广度优先搜索 计算连通分支数 深度优先搜索 procedure dfs(i:integer); var q:arcptr; begin 访问并处理顶点i; map[i].visited=true; q:=map[i].firstarc; while qnil do begin if map[q^.v].visited=false then dfs(q^.v); q:=q^.nextarc; end; end; 广度优先搜索 procedure bfs(i:integer); var p:arcptr; closed,open:integer; q:array[1..maxn] of integer; begin 访问并处理顶点i; map[i].visited:=true; 顶点i进入队列q; closed:=0; open:=1; repeat inc(closed); v:=q[closed]; p:=map[v].firstarc; while pnil do begin if map[p^.v].visited=false then begin 访问并处理顶点q^.v; map[q^.v].visited=true; inc(open); q[open]:=q^.v; end; q:=q^.nextarc; end; until closed=open; end; 计算连通分支数 count:=0; for i:=1 to n do map[i].visited:=false; for i:=1 to n do if map[i].visited=false do begin in

文档评论(0)

1亿VIP精品文档

相关文档