
第6章图6.1图的基本概念6.2图的表示与实现6.3图的遍历6.4最小生成树6.5拓扑排序6.6关键路径6.7最短路径6.8最大流问题7*中国科学技术大学ypb@ustc.edu.cn
ypb@ustc.edu.cn 1 中国科学技术大学 第6章 图 6.1图的基本概念 6.2图的表示与实现 6.3图的遍历 6.4最小生成树 6.5拓扑排序 6.6关键路径 6.7最短路径 6.8最大流问题*

6.1图的基本概念图(graph):一个顶点(vertex)的有穷集V(G)和一个弧(arc)的集合E(G)组成。记做:G=(V,E)。V是数据结构中的数据元素,E是集合上的关系·弧(arc)、弧头(终点)、弧尾(起点):一表从v到w的弧·有向图(digraph)、无向图(undigraph)、边:- (v,w)代表和:有向网、无向网:一带权的有向图和无向图完全图(completegraph):边e为n(n-1)/2有向完全图:弧e为n(n-1)2ypb@ustc.edu.cn中国科学技术大学
ypb@ustc.edu.cn 2 中国科学技术大学 6.1图的基本概念 • 图(graph): – 一个顶点(vertex)的有穷集V(G)和一个弧(arc)的 集合E(G)组成。记做:G=(V,E)。V是数据结构中 的数据元素,E是集合上的关系 • 弧(arc)、弧头(终点)、弧尾(起点): – 表从v到w的弧 • 有向图(digraph) 、无向图(undigraph) 、边: – (v,w)代表和 • 有向网、无向网: – 带权的有向图和无向图 • 完全图(complete graph):边e为n(n-1)/2 • 有向完全图:弧e为n(n-1)

(b)无向图G2(a)有向图 Gi108VoV.153020302010V4115(a)有向网G3(b)无向网G4中国科学技术大学ypb@ustc.edu.cn
ypb@ustc.edu.cn 3 中国科学技术大学

稀疏图(sparsegraph):有向图enlogn子图(subgraph):- G=(V,E),G'=(V',E"),如V’≤V且E≤E",则称G'是G的子图度(degree)、出度(OutDegree)、入度(lIndegree)::称u邻接到v,或v邻接自u。邻接到某顶点的弧的数目称该顶点的入度ID(v);邻接自某顶点的弧的数目称该顶点的出度OD(u);某顶点的入度、出度之和为该顶点的度TD(v)路径和回路:一有向路径/无向路径,路径长度、回路或环连通图和连通分量:一连通图(无向),强连通图(有向),连通分量生成树和生成森林(所有顶点/连通图/无回路)中国科学技术大学ypb@ustc.edu.cn
ypb@ustc.edu.cn 4 中国科学技术大学 • 稀疏图(sparse graph):有向图enlogn • 子图(subgraph): – G=(V,E),G’=(V’,E’),如V’≦V且E≦E’,则称G’是G的子图 • 度(degree)、出度(OutDegree)、入度(Indegree): – 称u邻接到v,或v邻接自u。邻接到某顶点的弧的数目称该顶 点的入度ID(v);邻接自某顶点的弧的数目称该顶点的出度OD(u); 某顶点的入度、出度之和为该顶点的度TD(v) • 路径和回路: – 有向路径/无向路径,路径长度、回路或环 • 连通图和连通分量: – 连通图(无向),强连通图(有向),连通分量 • 生成树和生成森林(所有顶点/连通图/无回路)

图的ADT描述ADT Graph(数据对象V:V是同类型数据元素的非空有限集,称为顶点集。数据关系R:R=/Vi,V;EV且Path(vi,V,),表示从vi到v;的弧,谓词Path(vi,V)定义了弧的意义和信息)基本操作:CreateGraph(&G,V,E)- DestroyGraph(&G)5中国科学技术大学ypb@ustc.edu.cn
ypb@ustc.edu.cn 5 中国科学技术大学 图的ADT描述 ADT Graph{ 数据对象V: V是同类型数据元素的非空有限集,称为顶点集。 数据关系R: R={|vi,vj∈V且Path(vi,vj),表示从vi 到vj的弧,谓词Path(vi,vj)定义了弧的意义和信 息} 基本操作: – CreateGraph(&G, V, E) – DestroyGraph(&G)

丫- LocateVex(G , u)- GetVex(G , v)- PutVex(&G,V, value)- FirstAdjVex(G , v)- NextAdjVex(G, V, w)- InsertVex(&G , v)- DeleteVex(&G, v)- InsertArc(&G, V, w)- DeleteArc(&G , V, w)- DFSTraverse(G, v , visitO)- BFSTraverse(G, v, visitO)^ end ADT Graph6中国科学技术大学ypb@ustc.edu.cn
ypb@ustc.edu.cn 6 中国科学技术大学 – LocateVex(G,u) – GetVex(G,v) – PutVex(&G,v,value) – FirstAdjVex(G,v) – NextAdjVex(G,v,w) – InsertVex(&G,v) – DeleteVex(&G,v) – InsertArc(&G,v,w) – DeleteArc(&G,v,w) – DFSTraverse(G,v,visit()) – BFSTraverse(G,v,visit()) } end ADT Graph

6.2图的表示与实现>图的数组(邻接矩阵)存储表示typedef enum(DG , DN , AG , AN) GraphKind ;typedef int ArcType ;typedef struct VertexTypevexs[MAX V NUM]ArcTypearcs [MAX V NUMI MAX V NUM]intvexnum,arcnum;kind;GraphKind}MGraph;中国科学技术大学ypb@ustc.edu.cn
ypb@ustc.edu.cn 7 中国科学技术大学 6.2图的表示与实现 ➢ 图的数组(邻接矩阵)存储表示 typedef enum{DG,DN,AG,AN} GraphKind; typedef int ArcType; typedef struct{ VertexType vexs[MAX_V_NUM]; ArcType arcs [MAX_V_NUM][ MAX_V_NUM]; int vexnum,arcnum; GraphKind kind; }MGraph;

8200110888153088800005815108A2=00012010888000305888的邻接矩阵(a)G,的邻接矩阵(b) G4Vo20301V.8中国科学技术大学ypb@ustc.edu.cn
ypb@ustc.edu.cn 8 中国科学技术大学

部分操作的实现void CreateGraph(MGraph &G) int LocateVex(MGraph G, VertexType v) void InsertArc(MGraph &G, VertexType viVertexType vi)int FirstAdjVex(MGraph G, int v)int NextAdiVex(MGraph G, int V, int w)9中国科学技术大学ypb@ustc.edu.cn
ypb@ustc.edu.cn 9 中国科学技术大学 部分操作的实现 • void CreateGraph(MGraph &G) • int LocateVex(MGraph G, VertexType v) • void InsertArc(MGraph &G, VertexType vi, VertexType vj) • int FirstAdjVex(MGraph G, int v) • int NextAdjVex(MGraph G, int v, int w)

voidCreateGraph(MGraph &G)Ⅱ从键盘输入图顶点和边集,创建用邻接矩阵表示的图Gcin>>G.vexnum>>G.arcnum>>G.kind;for(i=O;i>G.vexs[il;//输入顶点集for(i=0;i>vi>>vj;I/输入弧i=LocateVex(G,vi);//求顶点vi的存储位置下标j=LocateVex(G,vi);//求顶点vj的存储位置下标G.arcs[iji]=1;//置弧if(G.kind==2)G.arcs[ij[i]=1;I/无向图,置对称弧11//CreateGraph
void CreateGraph(MGraph &G){ //从键盘输入图顶点和边集,创建用邻接矩阵表示的图G cin>>G.vexnum>>G.arcnum>>G.kind; for(i=0;i>G.vexs[i]; //输入顶点集 for(i=0;i>vi>>vj; //输入弧 i=LocateVex(G,vi); //求顶点vi的存储位置下标 j=LocateVex(G,vj); //求顶点vj的存储位置下标 G.arcs[i][j]=1; //置弧 if(G.kind==2) G.arcs[j][i]=1; //无向图,置对称弧 } } //CreateGraph