数据结构-图

一. 图的定义与术语

 - 顶点(Vertex)
 - 弧尾(Tail)<v,w>中的v这个初始点叫做弧尾
 - 弧头(Head)<v,w>中的w或终端点叫做弧头
 - 有向图(Digraph)只有单向箭头的图
 - 边(Edge)双向箭头
 - 无向图(Undigraph)只有边,e的取值范围(0,n(n-1)/2)
 - 完全图 有(n(n-1)/2)条边的叫完全图
 - 有向完全图 有(n(n-1))条弧的有向图
 - 稀疏图/稠密图  区分(e/v<nlogn)
 - 权 弧边的数值
 - 出度   以v为弧尾的弧的数目
 - 入读  以v为弧尾的弧的数目
 - 度  v的出度加入度
 - 简单路径  顶点不重复出现的路径 
 - 连通  两个顶点之间有路径
 - 连通图  任意两个顶点连通
 - 连通分量 非连通图中的连通子图
 - 强连通图 对于每一对(vi,vj)都存在路径
 - 强连通分量 非强连通图的极大强连通子图
 - 生成树 极小连通子图有n个顶点 (n-1)条边
 - 生成森林  由若干棵有向树组成,有所有顶点,但只有足以构成若干棵不相交的有向树的弧 

 - 网有权值图没有


二.图的存储结构
 

#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20
typedef enum{DG,DN,UDG,UDN}GraphKind;
typedef struct ArcCell {
	VRType adj; //顶点关系类型表示是否相邻或者权值大小
	InfoType* info;//弧的相关信息
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct {
	VertexType vexs[MAX_VERTEX_NUM];//顶点向量
	AdjMatrix arcs;//邻接矩阵
	int vexnum, arcnum;//顶点数与弧数
	GraphKind kind;//图类型
}MGraph;

无向网

Status CreateUDN(MGraph& G) {
	scanf(&G.vexnum, &G.arcnum, &IncInfo);
	for (i =0 ; i < G.vexnum; ++i)scanf(&G.vexs[i]);//输入顶点向量
	for (i = 0; i < G.vexnum; ++i) {
		for (w = 0; w < G.vexnum; ++w) {
			G.arcs[i][w] = { INFINITY,NULL };
		}
	}//初始化邻接矩阵
	for (k = 0; k < G.arcnum; ++k); {
		scanf(&v1. & v2, &w);//一条弧的信息
		i = LocateVex(G, v1); j = LocateVex(G, v2);//确定位置
		G.arcs[i][j].adj = w;//输入权值
		if (IncInfo)Input(*G.arcs[i][j].info);//录入相关信息
		G.arcs[j][i] = G.arcs[i][j];//对称处理
	}
}

邻接表

#define MAX_VERTE_NUM 20
typedef struct ArcNode {
	int adjvex;//指向顶点位置
	struct ArcNode* nextarc;//下一个顶点指针
	InfoType* info;//弧信息
}ArcNode;//各个弧节点
typedef struct VNode {
	VertexType data;
	ArcNode* firstarc;
}VNode,adjList[MAX_VERTEX_NUM];//构造头节点
typedef struct {
	AdjList vertices;
	int vexnum, arcnun;
	int kind;
};

当无向图中有n个顶点、e条边时,则它的邻接表需n个头节点,和2e个表节点。显然,在边稀(e<<n(n-1)/2)的情况下,该表比矩阵较节省空间。但是在两个顶点的关系判断上则需要进行对某一个链表的遍历,不够方便。

十字链表

有向图存储方式,邻接表与逆邻接表的结合,十字链表中每一条弧有一个节点,每一个顶点有一个节点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值