DS07-图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图的连通 在无向图G中,若两个顶点vi和vj之间有 在无向图G 若两个顶点v 路径存在,则称v 是连通的. 路径存在,则称vi 和vj 是连通的.若G中任意两 个顶点都是连通的,则称G 连通图. 个顶点都是连通的,则称G为连通图.非连通图的 连通分量. 极大连通子图叫做连通分量 极大连通子图叫做连通分量.
C
E
有向图
A B vexs = C D E
2
20 40
5
70
1
30 50
4
∞ 20 30 edges = ∞ ∞ ∞
20 30 ∞ ∞ ∞ ∞ ∞ 40 ∞ ∞ ∞ ∞ 50 ∞ ∞ 40 50 ∞ 70 80 ∞ ∞ 70 ∞ ∞ ∞ ∞ 80 ∞ ∞
V是有限的非空顶点集,E是V上的顶点对 是有限的非空顶点集, 所构成的边集,分别用V(G)和E(G) 所构成的边集,分别用V 来表示图中的顶点集和边集. 来表示图中的顶点集和边集.用二元组 G=(V,E)来表示图G. G=( 来表示图G
有向图与无向图 若图G中的每条边都是有方 若图G 向的,则称G为有向图.有向边也称为弧 向的,则称G为有向图.有向边也称为弧. 若图G中的每条边都是没有方向的,则称G 若图G中的每条边都是没有方向的,则称G为 无向图. 无向图. 对有n个顶点的图, 完全图 对有n个顶点的图,若为无向图且边 无向完全图; 数为n(n 1)/2,则称其为无向完全图 n(n数为n(n-1)/2,则称其为无向完全图;若为 有向图且边数为n(n n(n则称其为有向完 有向图且边数为n(n-1) ,则称其为有向完 全图. 全图. 是一条无向边, 邻接顶点 若(vi,vj)是一条无向边,则称 顶点v 互为邻接点,或称v 相邻接, 顶点vi和vj互为邻接点,或称vi和vj相邻接, 并称边( 关联于顶点v 并称边(vi,vj)关联于顶点vi和vj,或称 与顶点v 相关联. (vi,vj)与顶点vi和vj相关联.
3
1 2 3 vexs = 4 5 有向权图 6
6
80
邻接矩阵表示法中无向网络的建立算法
void Create_Graph(graph *ga) ( ) { int i,j ,k,w; , , ; printf ("请输入图的顶点数和边数:\n"); 请输入图的顶点数和边数: 请输入图的顶点数和边数 ; scanf ("%d",&(ga->n),& (ga->e)); , , ; printf ("请输入顶点信息 顶点编号 ,建立顶点信息表:\n") ; 请输入顶点信息(顶点编号 请输入顶点信息 顶点编号),建立顶点信息表: for(i = 0;i<ga->n;i++) ; ; scanf("%c",&(ga->vexs[i]));/*输入顶点信息 输入顶点信息*/ ; 输入顶点信息 for (i = 0;i<ga->n;i++) /*邻接矩阵初始化 邻接矩阵初始化*/ ; ; 邻接矩阵初始化 for (j = 0;j<ga->n;j++) ; ; ga->edges[i][j] = 0; ; for (k = 0;k<ga->e;k++) /*读入边的顶点编号和权值,建立邻接矩阵 读入边的顶点编号和权值, ; ; 读入边的顶点编号和权值 建立邻接矩阵*/ { printf ("请输入第 请输入第%d条边的顶点序号 ,j和权值 :",k+1); 条边的顶点序号i, 和权值 和权值w: 请输入第 条边的顶点序号 ; scanf ("%d,%d,%d",&i,&j,&w); , , , , , ; ga->edges[i][j] = w; ; ga->edges[j][i] = w; ; } }
有向图的邻接表和逆邻接表
邻接表 v
1
逆邻接表 2 1 ^ 3 ^
V1 V2 V3
V1
2 1
^ ^
v v
3 2
V2 V3
2 ^
G6
在有向图的邻接表中,第 i 个边链表链接的边 在有向图的邻接表中, 发出的边.也叫做出边表 出边表. 都是顶点 i 发出的边.也叫做出边表. 在有向图的逆邻接表中, 在有向图的逆邻接表中,第 i 个边链表链接的 的边.也叫做入边表 入边表. 边都是进入顶点 i 的边.也叫做入边表.
建立无向图邻接表的算法
void creatqraph(Ikgraph *ga) ( ) /*建立无向图的邻接表 建立无向图的邻接表*/ { 建立无向图的邻接表 int i,j,e,k; ,, , ; pointer p; ; printf("请输入顶点数:\n"); 请输入顶点数: 请输入顶点数 ; 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; ; scanf ("\n%d,%d\n", &i,&j ); /*读入一个顶点对号 和j*/ 读入一个顶点对号i和 , , ; 读入一个顶点对号 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;/*将新表结点插入到顶点 i的边表的头部 将新表结点插入到顶点v ; 将新表结点插入到顶点 的边表的头部*/ p = (pointer)malloc(size(struct node));/*生成邻接点序号为 的表结点 生成邻接点序号为i的表结点 ; 生成邻接点序号为 的表结点*/ p-> vertex = i; ; p->next = ga->adlist[j].first; ga->adlist[j].first=p; /*将新表结点插入到顶点 j的边表头部 将新表结点插入到顶点v ; 将新表结点插入到顶点 的边表头部*/ scanf ("\n%d,%d\n", &i,&j );/*读入一个顶点对号 和j*/ 读入一个顶点对号i和 , , ; 读入一个顶点对号 } ga->e = e ; }
7.2 图的存储结构
邻接矩阵 (Adjacency Matrix)表示法 Matrix)表示法
在图的邻接矩阵表示中,有一个记录各个顶点信 在图的邻接矩阵表示中, 息的顶点表, 息的顶点表,还有一个表示各个顶点之间关系的 邻接矩阵. 邻接矩阵. E)是一个有 个顶点的图, 设图 A = (V, E)是一个有 n 个顶点的图,则图的 .Edge[n][n],定义: 邻接矩阵是一个二维数组 A .Edge[n][n],定义:
1, 如果 < i , j >∈ E 或者 (i , j ) ∈ E A.Edge [i ][ j ] = 0, 否则
无向图的邻接矩阵是对称的,有向图的邻接矩阵 无向图的邻接矩阵是对称的, 一般情况下是不对称的. 一般情况下是不对称的.
在有向图中, 在有向图中, 统计第 i 行 1 的个数可得顶点 i 的出度, 的出度, 的入度. 统计第 j 列 1 的个数可得顶点 j 的入度. 在无向图中, 的个数可得顶点i 的度. 在无向图中, 统计第 i 行 (列) 1 的个数可得顶点i 的度.
路径 在图 G=(V, E) 中, 若存在一个顶点序列 vp1, vp2, …, vpm,使得(vi, vp1),(vp1, vp2), 使得( ..., ...,(vpm, vj)均属于E,则称顶点vi到vj存在一 条路径. 可以相同外, 条路径.若一条路径上除了vi 和vj 可以相同外, 其余顶点均不相同,则称此路径为一条简单路径 其余顶点均不相同,则称此路径为一条简单路径 .起点和终点相同的路径称为简单回路或简单环. 起点和终点相同的路径称为简单回路或简单环 简单回路或简单环.
A C D E F E F B A B C D
无向图及其连通分量示意
强连通图与强连通分量 在有向图中, 若对于 在有向图中, 每一对顶点vi和 都存在一条从vi到vj和从 和从vj 每一对顶点vi和vj, 都存在一条从vi到vj和从vj vi的路径 则称此图是强连通图. 的路径, 到vi的路径,则称此图是强连通图.非强连通图 的极大强连通子图叫做强连通分量. 的极大强连通子图叫做强连通分量.
V1 V2 V1
V2
V3
V4
V3
V4
有向图及其2 有向图及其2个强连通分量示意
权 某些图的边具有与它相关的数, 称之为权. 某些图的边具有与它相关的数, 称之为权 这种带权图叫做网络 网络. 这种带权图叫做网络.
10
2
6
7 12
5
9
60
B
80 75
40
1 3
7 15
8 6
3 6
A
30
C
35
4
16
7
邻接表的类型定义
#define nmax 100 /*假设顶点的最大数为 假设顶点的最大数为100*/ 假设顶点的最大数为 typedef struct node *pointer; ; struct node { /*表结点类型 表结点类型*/ 表结点类型 int vertex ; struct node *next ; } nnode; ; typedef struct {/*表头结点类型,即顶点表结点类型*/ 表头结点类型,即顶点表结点类型 表头结点类型 datatype data ; pointer first ;/*边表头指针 边表头指针*/ 边表头指针 }headtype ; typedef struct { /*表头结点向量,即顶点表 表头结点向量, 表头结点向量 即顶点表*/ headtype adlist[nmax]; int n,e ; , }lkgraph ;
顶点的度 一个顶点v的度是与它相关联的边的条 一个顶点v 记作TD(v 数.记作TD(v). 为终点的有向边的条数, 顶点 v 的入度 是以 v 为终点的有向边的条数, 记作 ID(v). ID(v). 的出度是以 为始点的有向边的条数, 顶点 v 的出度是以 v 为始点的有向边的条数, 记作 OD(v). OD(v). 子图 设有两个图 G=(V, E) 和 G'=(V', E').若 G'= E'). V' V 且 E'E, 则称 图G' 是 图G 的子图. V' E' 的子图.
算法分析
该算法的执行时间是O(n+n +e),由于e< 该算法的执行时间是O(n+n2+e),由于e< n2, 所以算法的时间复杂度为O(n 所以算法的时间复杂度为O(n2).
邻接表 (Adjacency List)表示法 List)表示法
无向图的邻接表
表头结点 data first 表结点 vertex data first v3 v4 G5 v1 v2 v3 v4 next vertex 2 1 1 2 next 3 ^ 4 ^ 4 ^ 3 ^
网络的邻接矩阵
W ( i , j ), A . Edge [ i ][ j ] = ∞ , 0, 如果 i ! = j 且 < i , j > ∈ E 或 ( i , j ) ∈ E 否则, 但是 i ! = j 对角线 i == j
邻接矩阵表示法中图的类型定义: 邻接矩阵表示法中图的类型定义:
D
45
E
权图
生成树 一个连通图的生成树是它的极小 连通子图, 个顶点的情形下, 连通子图,在n个顶点的情形下,有n-1条 边. 生成林 若G是一个不连通的无向图,G的 是一个不连通的无向图, 每个连通分量都有一棵生成树, 每个连通分量都有一棵生成树,这些生成 树构成G的生成森林,简称生成林. 树构成G的生成森林,简称生成林.
#define MAXSIZE 100 /*图的顶点个数 图的顶点个数*/ 图的顶点个数 typedef int datatype; typedef struct { datatype vexs[MAXSIZE]; /*顶点信息表 顶点信息表*/ ; 顶点信息表 int edges[MAXSIZE][ MAXSIZE] ;/ *邻接矩阵 邻接矩阵*/ 邻接矩阵 int n,e ; /*顶点数和边数 顶点数和边数*/ , 顶点es = 1 1 1
1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0
3
5
无向图
1 2 vexs = 3 4 5
B A D
0 0 edges = 0 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
结点双亲的指针数组设为全局量nmax为结点数最大值intgetrootintparenti
第 7章 图
基本概念 图的存储结构 图的遍历 生成树 最短路径 拓扑排序
V1
V2
V1
V2
V3 V3 V4
V4
V5
无向图G1
有向图G2
7.1 图的基本概念
图的定义:一个图G是由两个集合V 组成, 图的定义:一个图G是由两个集合V和E组成,
v1 v2
每个链表的上边附设一个表头结点 每个链表的上边附设一个表头结点,在表头 表头结点, 结点中,除了设有链域first用于指向链表中第 结点中,除了设有链域first用于指向链表中第 一个结点之外,还设有存储顶点v 一个结点之外,还设有存储顶点vi名或其它有 关信息的数据域data 关信息的数据域data . 把同一个顶点发出的边链接在同一个边链表 链表的每一个结点代表一条边,叫做表 中,链表的每一个结点代表一条边,叫做表 结点, 结点,结点中保存有与该边相关联的另一顶 点的顶点下标 vertex 和指向同一链表中下一 next. 个表结点的指针 next.
相关文档
最新文档