图的存储--邻接矩阵

邻接矩阵是一种最普通的存储图的结构,既可存储无向图(网),又可以存储有向图(网)。

邻接矩阵一般用一个一维数组存储图的顶点信息;用一个二维数组(矩阵)存储顶点之间是否邻接。

 

邻接矩阵存储不加权图时,直接用0、1来判断俩顶点之间是否邻接。存储加权图时,则用无穷表示不邻接,用弧上权值表示邻接。

#define MAX_VERTEX_NUM 10		// 图最大顶点数
typedef enum { DG, DN, UDG, UDN }GraphKind;	// 图类型(有向图、有向网、无向图、无向网)
typedef int VerType;		// 顶点类型
typedef string InfoType;	// 弧上信息类型
typedef int VRType;			// 顶点之间的关系
// 弧
typedef struct Arc {
	Arc() :is_adj(0), info(NULL) {}
	Arc(VRType adj) :is_adj(adj), info(NULL) {}
	VRType is_adj;		// 该弧俩顶点是否联通
	InfoType* info;		// 弧信息
}Arc, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
// 图
typedef struct Graph{
	Graph() :ver_num(0), arc_num(0) {}
	VerType Vertex[MAX_VERTEX_NUM];	// 顶点数组
	AdjMatrix AdjM;		// 邻接矩阵
	int ver_num;		// 顶点数
	int arc_num;		// 弧数
	GraphKind Kind;		// 图类型
}Graph;

获取顶点在顶点数组位置

// 获取顶点位置
int LocateVertex(Graph &graph, VerType ver) {
	for (int i = 0; i < graph.ver_num; ++i) {
		if (ver == graph.Vertex[i]) return i;
	}
	return -1;
}

无向图:

// 创建无向图
void CreatUDG(Graph &graph) {
	graph.Kind = UDG;
	cout << "输入顶点数、边数>> " << endl;
	cin >> graph.ver_num >> graph.arc_num;
	cout << "输入顶点信息>> " << endl;
	for (int i = 0; i < graph.ver_num; ++i) {
		cin >> graph.Vertex[i];
	}
	VerType v1, v2;
	bool Is_Info = false;
	for (int i = 0; i < graph.arc_num; ++i) {
		cout << "输入联通的顶点> " << endl;
		cin >> v1 >> v2;
		int index1 = LocateVertex(graph, v1);
		int index2 = LocateVertex(graph, v2);
		if (index1 < 0 || index2 < 0) {
			cout << "联通顶点错误" << endl;
			--i;
			continue;
		}
		cout << "弧上是否存储信息>>" << endl;
		cout << " 1、是   0、否" << endl;
		cin >> Is_Info;
		graph.AdjM[index1][index2].is_adj = 1;
		graph.AdjM[index2][index1].is_adj = 1;
		if (Is_Info) {
			cout << "输入弧上信息" << endl;
			InfoType INFO;
			cin >> INFO;
			graph.AdjM[index1][index2].info = new InfoType(INFO);
			graph.AdjM[index2][index1].info = new InfoType(INFO);
		}
	}
}

有向图:

创建操作同无向图基本一致,无向图需同时设置俩条弧,而有向图只需设置一条有向弧。

无向网:

在无向图的基础上,将顶点不邻接设为无穷,邻接的顶点用弧上权值设置。(0不在代表不邻接,仅为弧上权值)

有向网:

同无向网原理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值