- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构第三次讨论课
对图进行数据存储与表示
实现图的最短路径算法
利用图的运算完成校内导航系统路径计算
主要内容:
一、图的存储与表示
邻接矩阵:是表示顶点之间相邻关系的矩阵。设G=(V,E)是一个图,其中V={v1,v2,…,vn}。G的邻接矩阵是一个具有下列性质的n阶方阵:
①对无向图而言,邻接矩阵一定是对称的,而且对角线一定为零(在此仅讨论无向简单图),有向图则不一定如此。
②在无向图中,任一顶点i的度为第i列所有元素的和,在有向图中顶点i的出度为第i行所有元素的和,而入度为第i列所有元素的和。
③用邻接矩阵法表示图共需要n^2个空间,由于无向图的邻接矩阵一定具有对称关系,所以扣除对角线为零外,仅需要存储上三角形或下三角形的数据即可,因此仅需要n(n-1)/2个空间
设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵:
图的矩阵
下图中无向图G 5 和有向图G 6 的邻接矩阵分别为A l 和A 2?
网络矩阵
若G是网络,则邻接矩阵可定义为:
下面带权图的两种邻接矩阵分别为A 3 和A 4?
template class T, class E
class Graphmtx : public GraphT, E {
friend istream operator ( istream in, GraphmtxT, E G); //输入
用邻接矩阵表示的图的类定义
#include SeqList.h //包含动态数组结构的顺序表类
template class T
class AdjMWGraph
{
private:
SeqListT Vertices; //顶点顺序表
int Edge[MaxVertices][MaxVertices]; //边权值数组
int numOfEdges; //边的个数
void DepthFirstSearch(const int v, int visited[],
void Visit(T item));
void BroadFirstSearch(const int v, int visited[],
void Visit(T item));
public:
AdjMWGraph(const int sz = MaxVertices); //构造函数
~AdjMWGraph(void){}; //析构函数
int NumOfVertices(void) //取顶点个数
{return Vertices.Size();}
int NumOfEdges(void) //取边的个数
{return numOfEdges;}
T GetValue(const int v); //取顶点数值
int GetWeight(const int v1, const int v2); //取边的权值
void InsertVertex(const T vertex); //插入顶点
void InsertEdge(const int v1, const int v2, int weight);
//插入边
void DeleteVertex(const int v); //删除顶点
void DeleteEdge(const int v1, const int v2); //删除边
int GetFirstNeighbor(const int v); //取第一个邻接顶点
int GetNextNeighbor(const int v1, const int v2);
//取下一个邻接顶点
邻接表是邻接矩阵的改进形式。为此需要把邻接矩阵的各行分别组织为一个单链表。
在邻接表中,同一个顶点发出的边链接在同一个边链表中,每一个链结点代表一条边(边结点),结点中有另一顶点的下标 dest 和指针 link。对于带权图,边结点中还要保存该边的权值cost。
顶点表的第 i 个顶点中保存该顶点的数据,以及它对应边链表的头指针adj。
邻接表:
无向图的邻接表:
统计某顶点对应边链表中结点个数,可得该顶点的度。
某条边(vi, vj)在邻接表中有两个边结点,分别在第 i 个顶点和第 j 个顶点对应的边链表中。
有向图的邻接表和逆邻接表:
网络 (带权图) 的邻接表:
统计出边表中结点个数,得到该顶点的出度;
统计入边表中结点个数,得到该顶点的入度。
用邻接表表示的图的类定义
template class T, class E
struct Edge { //边结点的定义
int dest; //边的另一顶点位置
E cost;
原创力文档


文档评论(0)