数据结构——图的储存结构(邻接矩阵)

                           图的储存结构

       线性表是一对一关系,树是一对多关系,而现实生活中还存在一些多对多关系。比如交通网络,多个交通枢纽之间的连线可能错综复杂,一个交通枢纽会连接其他多个交通枢纽,而这个交通枢纽也会被其他多个交通枢纽连接,形成一个网络结构。这种网络结构就像地图上的交通路线一样,所以在数据结构中用图来描述这种多对多的关系。树是一种特化的图,就是图中每个节点都只被一个其他节点连接,而自己这个节点可以连接其他多个节点,而线性结构是一种特化的对,就是每个父节点都只有一个子节点。因此,线性结构最简单,而树结构复杂一些,可以推断图将会比树更复杂,因为图中节点之间的关系更多。
       和线性表树一样,图也由一些节点和连线组成,一个图可以表示为Graph=(V,R),其中V是节点集,R是这些节点的关系,这些关系可以用节点之间的连线,也就是边来表示。图分为有向图和无向图,就像交通道路一样,有些是单向道,有些是双向道(不过貌似两个地方之间的道路都有来回两个方向),有向图的边用箭头标注,箭尾是起始节点,箭头指向终止节点,也就是只能从箭尾节点到箭头节点,不能反向运动。
       有无向图中有一种极端情况,就是任意两个节点之间都有连线,如果节点数为n,那么边数e=n(n+1)/2,这样的无向图叫做完全图,而在有向图中,这种极端情况的图叫有向完全图,可以发现无向图中边数e范围为0<=e<=n(n+1)/2,而有向图中边数e的范围为0<=e<=n(n-1)。在图中,边较少的图叫稀疏图,边较多的图叫稠密图,这里的较多较少都是相对概念。
       图中任意一个节点到另外一个节点如何都有路径的话(不需要是直接连接的),那么这个图就叫连通图。而如果一个图不是连通的,那么去掉一些节点后这个图连通了,那么这个子图叫作原图的连通子图,去掉的节点最少的子图叫原图叫极大连通子图,也叫连通分量。对于有向图,连通图叫强连通图,一个图去掉一些边仍是连通的话,那么边去掉的最多的子图就叫极小连通子图,这时可以发现,极小连通子图已经退化成一棵树了,树是一棵刚好每个节点都可以互相到达的图(证明应该是离散数学上的,有点复杂,并且难以理解)。
       像哈夫曼树那样,可以给树节点之间的边上加上权值,同样,图的边上也可以加上权值,这时,这种图就叫网。这个边上的权值可以表示交通道路两个地点之间的距离,可以表示在网络通信中两个通信节点之间的通信开销等等,网在数学建模中具有非常重要的意义。
       图的储存和操作都比较复杂,下面是图的接口定义
#pragma once
#ifndef GRAPH_H
#define GRAPH_H
namespace dataStructure
{
	/**
	* 图接口定义
	*/
	template<typename T>
	class Graph
	{
	public:
		//获取节点的值
		virtual bool GetElem(int v, T &t) = 0;
		//设置节点的值
		virtual bool SetElem(int v, const T &t) = 0;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值